diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
index f7efbc7c198..5c00a4fc3bf 100644
--- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
@@ -174,7 +174,7 @@
/mob/living/simple_animal/bot/cleanbot/proc/clean(obj/effect/decal/cleanable/target)
anchored = 1
icon_state = "cleanbot-c"
- visible_message("[src] begins to clean up [target]")
+ visible_message("[src] begins to clean up [target].")
mode = BOT_CLEANING
spawn(50)
if(mode == BOT_CLEANING)
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index 6937b78520c..5c9329ab3b6 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -25,7 +25,7 @@
melee_damage_upper = 2
environment_smash = 0
stop_automated_movement_when_pulled = 1
- var/obj/udder/udder = null
+ var/obj/item/udder/udder = null
/mob/living/simple_animal/hostile/retaliate/goat/New()
udder = new()
@@ -97,7 +97,7 @@
attacktext = "kicks"
attack_sound = 'sound/weapons/punch1.ogg'
health = 50
- var/obj/udder/udder = null
+ var/obj/item/udder/udder = null
gold_core_spawnable = 2
/mob/living/simple_animal/cow/New()
@@ -272,28 +272,44 @@ var/global/chicken_count = 0
else
SSobj.processing.Remove(src)
-/obj/udder
-/obj/udder/New()
+/obj/item/udder
+ name = "udder"
+
+/obj/item/udder/New()
reagents = new(50)
reagents.my_atom = src
reagents.add_reagent("milk", 20)
-/obj/udder/proc/generateMilk()
+/obj/item/udder/proc/generateMilk()
if(prob(5))
reagents.add_reagent("milk", rand(5, 10))
-/obj/udder/proc/milkAnimal(obj/O, mob/user)
+/obj/item/udder/proc/milkAnimal(obj/O, mob/user)
var/obj/item/weapon/reagent_containers/glass/G = O
if(G.reagents.total_volume >= G.volume)
user << "[O] is full."
return
- var/transfered = reagents.trans_id_to(G, "milk", rand(5,10))
+ var/transfered = reagents.trans_to(O, rand(5,10))
if(transfered)
user.visible_message("[user] milks [src] using \the [O].", "You milk [src] using \the [O].")
else
user << "The udder is dry. Wait a bit longer..."
-/obj/udder/Destroy()
+/obj/item/udder/Destroy()
qdel(reagents)
return ..()
+
+
+/obj/item/udder/scavenger
+ name = "milksac"
+
+/obj/item/udder/scavenger/New()
+ reagents = new(50)
+ reagents.my_atom = src
+
+/obj/item/udder/scavenger/generateMilk()
+ if(prob(15))
+ reagents.add_reagent("cream", rand(5, 10))
+ if(prob(10))
+ reagents.add_reagent("salglu_solution", rand(5,10))
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index 0d41abe1c86..4f1e41b519a 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -733,6 +733,76 @@
icon = 'icons/obj/surgery.dmi'
icon_state = "demon_heart"
+
+//Gutlunches
+
+/mob/living/simple_animal/hostile/asteroid/scavenger/
+ name = "gutlunch"
+ desc = "A scavenger that eats raw meat, often found alongside ash walkers. Produces a thick, nutritious milk."
+ icon_state = "crab"
+ icon_living = "crab"
+ icon_dead = "crab_dead"
+ speak_emote = list("clicks")
+ emote_hear = list("clicks.")
+ emote_see = list("clacks.")
+ density = 0
+ speak_chance = 1
+ turns_per_move = 8
+ environment_smash = 0
+ move_to_delay = 15
+ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab = 1)
+ response_help = "pets"
+ response_disarm = "gently pushes aside"
+ response_harm = "squishes"
+ friendly = "pinches"
+ a_intent = "help"
+ ventcrawler = 2
+ gold_core_spawnable = 2
+ stat_attack = 1
+ gender = MALE
+ stop_automated_movement = FALSE
+ stat_exclusive = TRUE
+ robust_searching = TRUE
+ search_objects = TRUE
+ del_on_death = TRUE
+ loot = list(/obj/effect/decal/cleanable/blood/gibs)
+ wanted_objects = list(/obj/effect/decal/cleanable/xenoblood/, /obj/effect/decal/cleanable/xenoblood/xgibs, /obj/effect/decal/cleanable/blood/,
+ /obj/effect/decal/cleanable/blood/gibs/, /obj/effect/decal/cleanable/blood/drip/,/obj/effect/decal/cleanable/trail_holder)
+ var/obj/item/udder/scavenger/udder = null
+
+
+/mob/living/simple_animal/hostile/asteroid/scavenger/New()
+ udder = new()
+ deathmessage = "[src] is pulped into bugmash."
+ ..()
+
+/mob/living/simple_animal/hostile/asteroid/scavenger/Destroy()
+ qdel(udder)
+ udder = null
+ return ..()
+
+/mob/living/simple_animal/hostile/asteroid/scavenger/attackby(obj/item/O, mob/user, params)
+ if(stat == CONSCIOUS && istype(O, /obj/item/weapon/reagent_containers/glass))
+ udder.milkAnimal(O, user)
+ else
+ ..()
+
+/mob/living/simple_animal/hostile/asteroid/scavenger/AttackingTarget()
+ if(is_type_in_list(target,wanted_objects)) //we eats
+ udder.generateMilk()
+ visible_message("[src] slurps up [target].")
+ qdel(target)
+ HandleProcreation()
+ LoseTarget()
+ ..()
+
+/mob/living/simple_animal/hostile/asteroid/scavenger/proc/HandleProcreation()
+ if(udder.reagents.total_volume == udder.reagents.maximum_volume)
+ new /mob/living/simple_animal/hostile/asteroid/scavenger/(get_turf(src))
+
+/mob/living/simple_animal/hostile/asteroid/scavenger/female
+ gender = FEMALE
+
//Nests
/mob/living/simple_animal/hostile/spawner/lavaland
diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
index 2ee585ae7cb..a71f5fe68e9 100644
--- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm
+++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm
@@ -168,4 +168,4 @@
/mob/living/simple_animal/hostile/viscerator/New()
..()
- deathmessage = "[src] is smashed into pieces!"
+ deathmessage = "[src] is smashed into pieces!"