anchor.diff:  	attacktext = "kicks"
   	attack_sound = 'sound/weapons/punch1.ogg'
   	health = 50
  -	var/datum/reagents/udder = null
  +	var/obj/udder/udder = null
   
   /mob/living/simple_animal/cow/New()
  -	udder = new(50)
  -	udder.my_atom = src
  +	udder = new()
  +	..()
  +
  +/mob/living/simple_animal/cow/Destroy()
  +	qdel(udder)
  +	udder = null
   	..()
   
   /mob/living/simple_animal/cow/attackby(obj/item/O, mob/user, params)
   	if(stat == CONSCIOUS && istype(O, /obj/item/weapon/reagent_containers/glass))
  -		user.visible_message("[user] milks [src] using \the [O].", "<span class='notice'>You milk [src] using \the [O].</span>")
  -		var/obj/item/weapon/reagent_containers/glass/G = O
  -		var/transfered = udder.trans_id_to(G, "milk", rand(5,10))
  -		if(G.reagents.total_volume >= G.volume)
  -			user << "<span class='danger'>[O] is full.</span>"
  -		if(!transfered)
  -			user << "<span class='danger'>The udder is dry. Wait a bit longer...</span>"
  +		udder.milkAnimal(O, user)
   	else
   		..()
   
   /mob/living/simple_animal/cow/Life()
   	. = ..()
   	if(stat == CONSCIOUS)
  -		if(udder && prob(5))
  -			udder.add_reagent("milk", rand(5, 10))
  +		udder.generateMilk()
   
   /mob/living/simple_animal/cow/attack_hand(mob/living/carbon/M)
   	if(!stat && M.a_intent == "disarm" && icon_state != icon_dead)
  
positive.code: 			qdel(src)
  	else
  		SSobj.processing.Remove(src)
  
negative.code: 			enemies = list()
  			LoseTarget()
  			src.visible_message("<span class='notice'>[src] calms down.</span>")
  	if(stat == CONSCIOUS)
  		udder.generateMilk()
  		if(locate(/obj/effect/spacevine) in loc)
  			var/obj/effect/spacevine/SV = locate(/obj/effect/spacevine) in loc
  			SV.eat(src)
  		if(!pulledby)
  			for(var/direction in shuffle(list(1,2,4,8,5,6,9,10)))
  				var/step = get_step(src, direction)
  