diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index a4d9ca87384..9be75ea5367 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -23,6 +23,7 @@
#define BLOCK_GAS_SMOKE_EFFECT 8192 // blocks the effect that chemical clouds would have on a mob --glasses, mask and helmets ONLY!
#define THICKMATERIAL 8192 //prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. (NOTE: flag shared with BLOCK_GAS_SMOKE_EFFECT)
+#define AUTOEXTINGUISH 16384 // Suits that have this will automatically extinguish a burning mob when worn.
//Reagent flags
#define REAGENT_NOREACT 1
@@ -43,6 +44,7 @@
#define ALL_RPARTS 2048
#define NOGUNS 4096
#define NOTRANSSTING 8192
+#define PLASMA_BASED 16384
//Species clothing flags
#define HAS_UNDERWEAR 1
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index c80c13d514b..de39921c970 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -497,6 +497,11 @@ BLIND // can't see anything
else
to_chat(user, "You attempt to button up the velcro on \the [src], before promptly realising how retarded you are.")
+/obj/item/clothing/suit/proc/auto_extinguish(var/mob/living/carbon/human/user)
+ if(istype(user))
+ to_chat(user, "You hear a soft click and a hiss from your suit as it automatically extinguishes the fire.")
+ user.ExtinguishMob()
+
/obj/item/clothing/suit/equipped(var/mob/living/carbon/human/user, var/slot) //Handle tail-hiding on a by-species basis.
..()
if(ishuman(user) && hide_tail_by_species && slot == slot_wear_suit)
diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm
index 73fa69d297c..8ccf0a0a413 100644
--- a/code/modules/clothing/spacesuits/plasmamen.dm
+++ b/code/modules/clothing/spacesuits/plasmamen.dm
@@ -11,7 +11,7 @@
flags_inv = HIDEGLOVES|HIDESHOES
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
species_restricted = list("Plasmaman")
- flags = STOPSPRESSUREDMAGE
+ flags = STOPSPRESSUREDMAGE | AUTOEXTINGUISH
icon_state = "plasmaman_suit"
item_state = "plasmaman_suit"
@@ -24,16 +24,14 @@
..(user)
to_chat(user, "There are [extinguishes_left] extinguisher canisters left in this suit.")
-/obj/item/clothing/suit/space/eva/plasmaman/proc/Extinguish(var/mob/user)
- var/mob/living/carbon/human/H=user
- if(extinguishes_left)
+/obj/item/clothing/suit/space/eva/plasmaman/auto_extinguish(var/mob/living/carbon/human/H)
+ if(istype(H) && extinguishes_left)
if(next_extinguish > world.time)
return
next_extinguish = world.time + extinguish_cooldown
extinguishes_left--
- to_chat(H, "Your suit automatically extinguishes the fire.")
- H.ExtinguishMob()
+ ..()
/obj/item/clothing/head/helmet/space/eva/plasmaman
name = "plasmaman helmet"
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index b2e609c92f2..6d31c53263e 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -485,6 +485,8 @@
if(on_fire)
var/thermal_protection = get_thermal_protection()
+ if(wear_suit && wear_suit.flags & AUTOEXTINGUISH)
+ wear_suit.auto_extinguish(src)
if(thermal_protection >= FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT)
return
if(thermal_protection >= FIRE_SUIT_MAX_TEMP_PROTECT)
diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm
index 05f24facc65..bb8d1a59100 100644
--- a/code/modules/mob/living/carbon/human/species/plasmaman.dm
+++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm
@@ -6,7 +6,7 @@
//language = "Clatter"
unarmed_type = /datum/unarmed_attack/punch
- flags = IS_WHITELISTED | NO_BLOOD | NOTRANSSTING
+ flags = IS_WHITELISTED | NO_BLOOD | NOTRANSSTING | PLASMA_BASED
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
@@ -15,6 +15,7 @@
butt_sprite = "plasma"
breath_type = "plasma"
+ poison_type = null
heat_level_1 = 350 // Heat damage level 1 above this point.
heat_level_2 = 400 // Heat damage level 2 above this point.
diff --git a/code/modules/reagents/chemistry/reagents/misc.dm b/code/modules/reagents/chemistry/reagents/misc.dm
index e8505d64653..70482a10489 100644
--- a/code/modules/reagents/chemistry/reagents/misc.dm
+++ b/code/modules/reagents/chemistry/reagents/misc.dm
@@ -39,6 +39,25 @@
reagent_state = GAS
color = "#808080" // rgb: 128, 128, 128
+/datum/reagent/oxygen/on_mob_life(var/mob/living/carbon/human/H)
+ if(istype(H) && H.species && H.species.poison_type && H.species.poison_type == id)
+ H.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER) //Same as plasma.
+ if(istype(H) && H.species && H.species.flags & PLASMA_BASED) //Oxygen lights up plasma-based lifeforms.
+ if(prob(60))
+ H.adjust_fire_stacks(0.25)
+ if(prob(40))
+ H.IgniteMob() //Light them up.
+ ..()
+
+/datum/reagent/oxygen/reaction_mob(var/mob/living/carbon/human/H, method=TOUCH, volume)
+ if(istype(H) && H.species && H.species.flags & PLASMA_BASED) //Oxygen lights up plasma-based lifeforms.
+ if(method == INGEST)
+ to_chat(H, "You feel a horrible burning from within as your body bursts into flame!")
+ if(method == TOUCH)
+ to_chat(H, "Your body bursts into flames as it comes into contact with the substance!")
+ H.adjust_fire_stacks(1) //Same as phlogiston, guaranteed one-time firestack delivery and ignition.
+ H.IgniteMob()
+ ..()
/datum/reagent/nitrogen
name = "Nitrogen"
diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm
index 9fc96c714a8..48d8c33977d 100644
--- a/code/modules/reagents/chemistry/reagents/pyrotechnic.dm
+++ b/code/modules/reagents/chemistry/reagents/pyrotechnic.dm
@@ -22,7 +22,12 @@
color = "#7A2B94"
/datum/reagent/plasma/on_mob_life(mob/living/M)
- M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER)
+ var/mob/living/carbon/human/H = M
+ if(istype(H) && H.species && H.species.flags & PLASMA_BASED) //Plasma shouldn't poison plasmamen.
+ if(prob(20))
+ H.heal_organ_damage(1, 1)
+ else
+ M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER)
if(holder.has_reagent("epinephrine"))
holder.remove_reagent("epinephrine", 2)
if(iscarbon(M))