diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 53044c99b42..50a62aa2446 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1099,7 +1099,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
//LIFE//
////////
/datum/species/proc/handle_digestion(mob/living/carbon/human/H)
- if(HAS_TRAIT(src, TRAIT_NOHUNGER))
+ if(HAS_TRAIT(H, TRAIT_NOHUNGER))
return //hunger is for BABIES
//The fucking TRAIT_FAT mutation is the dumbest shit ever. It makes the code so difficult to work with
diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm
index 8e560d7c1aa..6bbf5c041cd 100644
--- a/code/modules/mob/living/carbon/human/species_types/abductors.dm
+++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm
@@ -13,6 +13,8 @@
var/datum/atom_hud/abductor_hud = GLOB.huds[DATA_HUD_ABDUCTOR]
abductor_hud.add_hud_to(C)
+ C.set_safe_hunger_level()
+
/datum/species/abductor/on_species_loss(mob/living/carbon/C)
. = ..()
var/datum/atom_hud/abductor_hud = GLOB.huds[DATA_HUD_ABDUCTOR]
diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm
index fd6dd45a67c..73e27f55f63 100644
--- a/code/modules/mob/living/carbon/human/species_types/android.dm
+++ b/code/modules/mob/living/carbon/human/species_types/android.dm
@@ -20,6 +20,9 @@
O.brute_reduction = 5
O.burn_reduction = 4
+ // Androids don't eat, hunger or metabolise foods. Let's do some cleanup.
+ C.set_safe_hunger_level()
+
/datum/species/android/on_species_loss(mob/living/carbon/C)
. = ..()
for(var/X in C.bodyparts)
diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
index f977dd0c4aa..fcd97492e47 100644
--- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm
+++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm
@@ -35,6 +35,7 @@
var/obj/item/organ/eyes/E = H.getorganslot(ORGAN_SLOT_EYES)
var/datum/action/item_action/organ_action/dullahan/D = locate() in E?.actions
D?.Trigger()
+ H.set_safe_hunger_level()
/datum/species/dullahan/on_species_loss(mob/living/carbon/human/H)
H.flags_1 |= HEAR_1
diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm
index 47ace68b131..04204c21712 100644
--- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm
+++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm
@@ -61,7 +61,7 @@
RegisterSignal(ethereal, COMSIG_ATOM_EMP_ACT, .proc/on_emp_act)
ethereal_light = ethereal.mob_light()
spec_updatehealth(ethereal)
-
+ C.set_safe_hunger_level()
/datum/species/ethereal/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load)
UnregisterSignal(C, COMSIG_ATOM_EMAG_ACT)
diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
index 726c58ff371..67fa9c481ef 100644
--- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
@@ -34,6 +34,10 @@
// This effects how fast body temp stabilizes, also if cold resit is lost on the mob
bodytemp_cold_damage_limit = (BODYTEMP_COLD_DAMAGE_LIMIT - 50) // about -50c
+/datum/species/plasmaman/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load)
+ . = ..()
+ C.set_safe_hunger_level()
+
/datum/species/plasmaman/spec_life(mob/living/carbon/human/H)
var/atmos_sealed = CanIgniteMob(H) && (isclothing(H.wear_suit) && H.wear_suit.clothing_flags & STOPSPRESSUREDAMAGE) && (isclothing(H.head) && H.head.clothing_flags & STOPSPRESSUREDAMAGE)
if(!atmos_sealed && (!istype(H.w_uniform, /obj/item/clothing/under/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/plasmaman) || !istype(H.gloves, /obj/item/clothing/gloves)))
diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
index 0de6c827db1..462f5ab27c0 100644
--- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
@@ -50,6 +50,7 @@
to_chat(C, "[info_text]")
C.fully_replace_character_name(null, pick(GLOB.nightmare_names))
+ C.set_safe_hunger_level()
/datum/species/shadow/nightmare/bullet_act(obj/projectile/P, mob/living/carbon/human/H)
var/turf/T = H.loc
diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
index d7663e777eb..7922ba18f55 100644
--- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm
+++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
@@ -18,6 +18,10 @@
changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN
species_language_holder = /datum/language_holder/skeleton
+/datum/species/skeleton/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load)
+ . = ..()
+ C.set_safe_hunger_level()
+
/datum/species/skeleton/check_roundstart_eligible()
if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
return TRUE
diff --git a/code/modules/mob/living/carbon/human/species_types/synths.dm b/code/modules/mob/living/carbon/human/species_types/synths.dm
index ee181800ef3..c8477d2fbc9 100644
--- a/code/modules/mob/living/carbon/human/species_types/synths.dm
+++ b/code/modules/mob/living/carbon/human/species_types/synths.dm
@@ -36,6 +36,7 @@
..()
assume_disguise(old_species, H)
RegisterSignal(H, COMSIG_MOB_SAY, .proc/handle_speech)
+ H.set_safe_hunger_level()
/datum/species/synth/on_species_loss(mob/living/carbon/human/H)
. = ..()
diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm
index b6a25d5ac7e..cb62182fd4e 100644
--- a/code/modules/mob/living/carbon/human/species_types/vampire.dm
+++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm
@@ -16,9 +16,6 @@
var/info_text = "You are a Vampire. You will slowly but constantly lose blood if outside of a coffin. If inside a coffin, you will slowly heal. You may gain more blood by grabbing a live victim and using your drain ability."
var/obj/effect/proc_holder/spell/targeted/shapeshift/bat/batform //attached to the datum itself to avoid cloning memes, and other duplicates
-
-
-
/datum/species/vampire/check_roundstart_eligible()
if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
return TRUE
@@ -32,6 +29,7 @@
if(isnull(batform))
batform = new
C.AddSpell(batform)
+ C.set_safe_hunger_level()
/datum/species/vampire/on_species_loss(mob/living/carbon/C)
. = ..()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 38aea4ee178..085d121debd 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1778,3 +1778,23 @@
/// Whether or not this mob will escape from storages while being picked up/held.
/mob/living/proc/will_escape_storage()
return FALSE
+
+/// Sets the mob's hunger levels to a safe overall level. Useful for TRAIT_NOHUNGER species changes.
+/mob/living/proc/set_safe_hunger_level()
+ // Nutrition reset and alert clearing.
+ nutrition = NUTRITION_LEVEL_FED
+ clear_alert("nutrition")
+ satiety = 0
+
+ // Trait removal if obese
+ if(HAS_TRAIT_FROM(src, TRAIT_FAT, OBESITY))
+ if(overeatduration >= 100)
+ to_chat(src, "Your transformation restores your body's natural fitness!")
+
+ REMOVE_TRAIT(src, TRAIT_FAT, OBESITY)
+ remove_movespeed_modifier(/datum/movespeed_modifier/obesity)
+ update_inv_w_uniform()
+ update_inv_wear_suit()
+
+ // Reset overeat duration.
+ overeatduration = 0