diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index ee9418148e9..77d15863443 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -423,7 +423,10 @@ Class Procs:
printing = FALSE
/obj/machinery/proc/do_hair_pull(mob/living/carbon/human/H)
- if(!ishuman(H))
+ if(stat & (NOPOWER|BROKEN))
+ return
+
+ if(!istype(H))
return
//for whatever reason, skrell's tentacles have a really long length
@@ -434,16 +437,16 @@ Class Procs:
var/datum/sprite_accessory/hair/hair_style = hair_styles_list[H.h_style]
for(var/obj/item/protection in list(H.head))
- if(protection && (protection.flags_inv & BLOCKHAIR))
+ if(protection && (protection.flags_inv & BLOCKHAIR|BLOCKHEADHAIR))
return
- if(hair_style.length >= 4)
- if(prob(25))
- H.apply_damage(30, BRUTE, BP_HEAD)
- H.visible_message("[H]'s hair catches in \the [src]!", "Your hair gets caught in \the [src]!")
- if(H.can_feel_pain())
- H.emote("scream")
- H.apply_damage(45, PAIN)
+ if(hair_style.length >= 4 && prob(25))
+ H.apply_damage(30, BRUTE, BP_HEAD)
+ H.visible_message(SPAN_DANGER("\The [H]'s hair catches in \the [src]!"),
+ SPAN_DANGER("Your hair gets caught in \the [src]!"))
+ if(H.can_feel_pain())
+ H.emote("scream")
+ H.apply_damage(45, PAIN)
/obj/machinery/proc/do_signaler() // override this to customize effects
return
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm
index 0f3ddd55414..7b080699362 100644
--- a/code/modules/reagents/Chemistry-Machinery.dm
+++ b/code/modules/reagents/Chemistry-Machinery.dm
@@ -395,8 +395,6 @@
var/beaker_contents = ""
var/dat = ""
- do_hair_pull(user)
-
if(!inuse)
for (var/obj/item/O in holdingitems)
processing_chamber += "\A [O.name]
"
@@ -441,7 +439,7 @@
switch(href_list["action"])
if ("grind")
- grind()
+ grind(usr)
if("eject")
eject()
if ("detach")
@@ -471,23 +469,24 @@
holdingitems -= O
holdingitems.Cut()
-/obj/machinery/reagentgrinder/proc/grind()
+/obj/machinery/reagentgrinder/proc/grind(mob/user)
power_change()
if(stat & (NOPOWER|BROKEN))
return
// Sanity check.
- if (!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume))
+ if(!beaker || (beaker && beaker.reagents.total_volume >= beaker.reagents.maximum_volume))
return
- playsound(src.loc, 'sound/machines/blender.ogg', 50, 1)
- inuse = 1
+ if(ishuman(user))
+ do_hair_pull(user)
+
+ playsound(get_turf(src), 'sound/machines/blender.ogg', 50, 1)
+ inuse = TRUE
// Reset the machine.
- spawn(60)
- inuse = 0
- src.updateUsrDialog()
+ addtimer(CALLBACK(src, .proc/grind_reset), 60)
// Process.
for (var/obj/item/O in holdingitems)
@@ -521,6 +520,11 @@
if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
break
+/obj/machinery/reagentgrinder/proc/grind_reset()
+ inuse = FALSE
+ updateUsrDialog()
+
+
/obj/machinery/reagentgrinder/MouseDrop_T(mob/living/carbon/human/target as mob, mob/user as mob)
if (!istype(target) || target.buckled || get_dist(user, src) > 1 || get_dist(user, target) > 1 || user.stat || istype(user, /mob/living/silicon/ai))
return
diff --git a/html/changelogs/doxxmedearly - hairpullfixes.yml b/html/changelogs/doxxmedearly - hairpullfixes.yml
new file mode 100644
index 00000000000..65104b9eada
--- /dev/null
+++ b/html/changelogs/doxxmedearly - hairpullfixes.yml
@@ -0,0 +1,7 @@
+author: Doxxmedearly
+
+delete-after: True
+
+changes:
+ - bugfix: "Any hat that hides hair should now stop machinery from pulling hair."
+ - bugfix: "Hair no longer gets caught in grinders from simply interacting with it; it will only happen while grinding. It also will not pull hair if unpowered or broken."