anchor.diff:  		to_chat(user, "<span class='notice'>There is already something in this slot!</span>")
   
   /obj/machinery/bloodbankgen/Topic(href, href_list)
  -	if(..() || panel_open)
  +	. = ..()
  +	if(. | !is_operational())
   		return
   
   	usr.set_machine(src)
   
   	if(href_list["activateinput"])
   		activateinput()
  -		updateUsrDialog()
   
   	else if(href_list["detachinput"])
   		detachinput()
  -		updateUsrDialog()
   
   	else if(href_list["activateoutput"])
   		activateoutput()
  -		updateUsrDialog()
   
   	else if(href_list["detachoutput"])
   		detachoutput()
  -		updateUsrDialog()
  +
  +	updateUsrDialog()
  
positive.code: 
  /obj/machinery/bloodbankgen/process()
  	if(!is_operational())
  		return PROCESS_KILL
  
  	bloodstored = reagents.total_volume
  
  	var/transfer_amount = 20
  
  	if(draining)
  		if(reagents.total_volume >= reagents.maximum_volume)
  			draining = FALSE
  			return
  
  		if(bag)
  			if(bag.reagents.total_volume)
  				var/datum/reagent/blood/B = bag.reagents.has_reagent("blood")
  				if(B)
  					var/amount = reagents.maximum_volume - reagents.total_volume //monitor the machine's internal storage
  					amount = min(amount, transfer_amount)
  					if(!amount)
  						draining = FALSE
  						updateUsrDialog()
  						visible_message("[src] beeps loudly.")
  						playsound(loc, 'sound/machines/twobeep.ogg', 50, 1)
  						return
  
  					if(bag.blood_type == "SY") //no infinite loops using synthetics.
  						reagents.add_reagent("syntheticblood", amount)
  					else
  						reagents.add_reagent("syntheticblood", (amount+(5*efficiency)))
  
  					if(bag.reagents.total_volume >= amount)
  						bag.reagents.remove_reagent("blood", amount)
  					else
  						visible_message("[src] beeps loudly.")
  						playsound(loc, 'sound/machines/twobeep.ogg', 50, 1)
  						draining = FALSE
  
  					bag.update_icon()
  					update_icon()
  					updateUsrDialog()
  		else
  			draining = FALSE
  			updateUsrDialog()
  			return
  
  	if(filling)
  		if(!reagents || !reagents.total_volume)
  			filling = FALSE //there ain't anything in the machine yo.
  			return
  		if(outbag && outbag.reagents.total_volume < outbag.reagents.maximum_volume)
  			var/amount = outbag.reagents.maximum_volume - outbag.reagents.total_volume //monitor the output bag's internal storage
  			amount = min(amount, transfer_amount)
  			if(!amount)
  				filling = FALSE
  				visible_message("[src] pings.")
  				playsound(loc, 'sound/machines/beep.ogg', 50, 1)
  				updateUsrDialog()
  				return
  
  			reagents.trans_to(outbag, amount)
  			outbag.update_icon()
  			update_icon()
  			updateUsrDialog()
  		else
  			visible_message("[src] pings.")
  			playsound(loc, 'sound/machines/beep.ogg', 50, 1)
  			filling = FALSE
  			updateUsrDialog()
  			return
  
  /obj/machinery/bloodbankgen/attackby(obj/item/O, mob/user, params)
  	if(user.a_intent == INTENT_HARM)
  
negative.code: 
  	if(istype(O, /obj/item/reagent_containers/blood))
  		. = TRUE //no afterattack
  		var/msg
  		if(panel_open)
  			. += "Close the maintenance panel"
  		if(!anchored)
  			. += "[msg ? " and a" : "A"]nchor its bolts"
  