From 08a14b1f01921ae2a5034f9988e56545d6a77f2f Mon Sep 17 00:00:00 2001 From: Drulikar Date: Wed, 29 Jul 2026 15:25:38 -0500 Subject: [PATCH 1/5] maybe this is the cause --- code/datums/elements/bloody_feet.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/datums/elements/bloody_feet.dm b/code/datums/elements/bloody_feet.dm index 8964eac5c882..0cad775a05cf 100644 --- a/code/datums/elements/bloody_feet.dm +++ b/code/datums/elements/bloody_feet.dm @@ -98,7 +98,8 @@ /datum/element/bloody_feet/proc/blood_crossed(mob/living/carbon/human/target, amount, bcolor, dry_time_left) SIGNAL_HANDLER Detach(target) - target.AddElement(/datum/element/bloody_feet, dry_time_left, target.shoes, amount, bcolor) + if(!QDELETED(target)) + target.AddElement(/datum/element/bloody_feet, dry_time_left, target.shoes, amount, bcolor) /datum/element/bloody_feet/proc/clear_blood(datum/target) SIGNAL_HANDLER From 4a1527343204791abbd60e7124e80b76c00a1c84 Mon Sep 17 00:00:00 2001 From: Drulikar Date: Wed, 29 Jul 2026 15:29:05 -0500 Subject: [PATCH 2/5] variable cleanup --- code/datums/elements/bloody_feet.dm | 46 ++++++++++++++--------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/code/datums/elements/bloody_feet.dm b/code/datums/elements/bloody_feet.dm index 0cad775a05cf..886f267b99d2 100644 --- a/code/datums/elements/bloody_feet.dm +++ b/code/datums/elements/bloody_feet.dm @@ -20,8 +20,8 @@ steps_to_take = steps color = bcolor - var/mob/living/carbon/human/H = target - H.bloody_footsteps = steps_to_take + var/mob/living/carbon/human/target_human = target + target_human.bloody_footsteps = steps_to_take LAZYADD(entered_bloody_turf, target) RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved), override = TRUE) @@ -45,17 +45,17 @@ UnregisterSignal(target_shoes[target], COMSIG_ITEM_DROPPED) LAZYREMOVE(target_shoes, target) - var/mob/living/carbon/human/H = target - if(ishuman(H)) - H.bloody_footsteps = 0 + var/mob/living/carbon/human/target_human = target + if(ishuman(target_human)) + target_human.bloody_footsteps = 0 return ..() -/datum/element/bloody_feet/proc/on_moved(mob/living/carbon/human/target, oldLoc, direction) +/datum/element/bloody_feet/proc/on_moved(mob/living/carbon/human/target, turf/old_loc, direction) SIGNAL_HANDLER - INVOKE_ASYNC(src, PROC_REF(add_tracks), target, oldLoc, direction) + INVOKE_ASYNC(src, PROC_REF(add_tracks), target, old_loc, direction) -/datum/element/bloody_feet/proc/add_tracks(mob/living/carbon/human/target, oldLoc, direction) +/datum/element/bloody_feet/proc/add_tracks(mob/living/carbon/human/target, turf/old_loc, direction) if(GLOB.perf_flags & PERF_TOGGLE_NOBLOODPRINTS) Detach(target) return @@ -66,27 +66,27 @@ return var/turf/T_in = target.loc - var/turf/T_out = oldLoc + var/turf/T_out = old_loc if(istype(T_in)) - var/obj/effect/decal/cleanable/blood/tracks/footprints/FP = LAZYACCESS(T_in.cleanables, CLEANABLE_TRACKS) - if(FP) - var/image/I = LAZYACCESS(FP.steps_in, "[direction]") - if(!I) - FP.add_tracks(direction, color, FALSE) + var/obj/effect/decal/cleanable/blood/tracks/footprints/print = LAZYACCESS(T_in.cleanables, CLEANABLE_TRACKS) + if(print) + var/image/steps_image = LAZYACCESS(print.steps_in, "[direction]") + if(!steps_image) + print.add_tracks(direction, color, FALSE) else - FP = new(T_in) - FP.add_tracks(direction, color, FALSE) + print = new(T_in) + print.add_tracks(direction, color, FALSE) if(istype(T_out)) - var/obj/effect/decal/cleanable/blood/tracks/footprints/FP = LAZYACCESS(T_out.cleanables, CLEANABLE_TRACKS) - if(FP) - var/image/I = LAZYACCESS(FP.steps_out, "[direction]") - if(!I) - FP.add_tracks(direction, color, TRUE) + var/obj/effect/decal/cleanable/blood/tracks/footprints/print = LAZYACCESS(T_out.cleanables, CLEANABLE_TRACKS) + if(print) + var/image/steps_image = LAZYACCESS(print.steps_out, "[direction]") + if(!steps_image) + print.add_tracks(direction, color, TRUE) else - FP = new(T_out) - FP.add_tracks(direction, color, TRUE) + print = new(T_out) + print.add_tracks(direction, color, TRUE) if(--target.bloody_footsteps <= 0) Detach(target) From 5b024e9c3ce1e5053ce5ba084fdeb4a477058f02 Mon Sep 17 00:00:00 2001 From: Drulikar Date: Wed, 29 Jul 2026 15:32:19 -0500 Subject: [PATCH 3/5] conscious foot prints --- code/datums/elements/bloody_feet.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/elements/bloody_feet.dm b/code/datums/elements/bloody_feet.dm index 886f267b99d2..eb83c4af5b14 100644 --- a/code/datums/elements/bloody_feet.dm +++ b/code/datums/elements/bloody_feet.dm @@ -98,7 +98,7 @@ /datum/element/bloody_feet/proc/blood_crossed(mob/living/carbon/human/target, amount, bcolor, dry_time_left) SIGNAL_HANDLER Detach(target) - if(!QDELETED(target)) + if(!QDELETED(target) && target.stat == CONSCIOUS) target.AddElement(/datum/element/bloody_feet, dry_time_left, target.shoes, amount, bcolor) /datum/element/bloody_feet/proc/clear_blood(datum/target) From 59d4ee6c832d0303ba7e507e0dc8e9bfc63260ef Mon Sep 17 00:00:00 2001 From: Drulikar Date: Thu, 30 Jul 2026 17:06:32 -0500 Subject: [PATCH 4/5] weakref timer --- code/datums/elements/bloody_feet.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/datums/elements/bloody_feet.dm b/code/datums/elements/bloody_feet.dm index eb83c4af5b14..6a2011c8d4e5 100644 --- a/code/datums/elements/bloody_feet.dm +++ b/code/datums/elements/bloody_feet.dm @@ -32,7 +32,7 @@ RegisterSignal(shoes, COMSIG_ITEM_DROPPED, PROC_REF(on_shoes_removed), override = TRUE) if(dry_time) - addtimer(CALLBACK(src, PROC_REF(clear_blood), target), dry_time) + addtimer(CALLBACK(src, PROC_REF(clear_blood), WEAKREF(target)), dry_time) /datum/element/bloody_feet/Detach(datum/target, force) UnregisterSignal(target, list( @@ -98,9 +98,12 @@ /datum/element/bloody_feet/proc/blood_crossed(mob/living/carbon/human/target, amount, bcolor, dry_time_left) SIGNAL_HANDLER Detach(target) - if(!QDELETED(target) && target.stat == CONSCIOUS) + if(target.stat == CONSCIOUS) target.AddElement(/datum/element/bloody_feet, dry_time_left, target.shoes, amount, bcolor) /datum/element/bloody_feet/proc/clear_blood(datum/target) SIGNAL_HANDLER + if(isweakref(target)) + var/datum/weakref/target_ref = target + target = target_ref.resolve() Detach(target) From 4d3b6486746db7c9e9614e02ed8a085242ed96b9 Mon Sep 17 00:00:00 2001 From: Drulikar Date: Thu, 30 Jul 2026 21:56:28 -0500 Subject: [PATCH 5/5] More refactoring for conscious --- code/datums/elements/bloody_feet.dm | 6 ++-- .../effects/decals/cleanable/blood/blood.dm | 30 +++++++++++-------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/code/datums/elements/bloody_feet.dm b/code/datums/elements/bloody_feet.dm index 6a2011c8d4e5..804e4627539d 100644 --- a/code/datums/elements/bloody_feet.dm +++ b/code/datums/elements/bloody_feet.dm @@ -53,7 +53,8 @@ /datum/element/bloody_feet/proc/on_moved(mob/living/carbon/human/target, turf/old_loc, direction) SIGNAL_HANDLER - INVOKE_ASYNC(src, PROC_REF(add_tracks), target, old_loc, direction) + if(target.stat == CONSCIOUS) + INVOKE_ASYNC(src, PROC_REF(add_tracks), target, old_loc, direction) /datum/element/bloody_feet/proc/add_tracks(mob/living/carbon/human/target, turf/old_loc, direction) if(GLOB.perf_flags & PERF_TOGGLE_NOBLOODPRINTS) @@ -98,8 +99,7 @@ /datum/element/bloody_feet/proc/blood_crossed(mob/living/carbon/human/target, amount, bcolor, dry_time_left) SIGNAL_HANDLER Detach(target) - if(target.stat == CONSCIOUS) - target.AddElement(/datum/element/bloody_feet, dry_time_left, target.shoes, amount, bcolor) + target.AddElement(/datum/element/bloody_feet, dry_time_left, target.shoes, amount, bcolor) /datum/element/bloody_feet/proc/clear_blood(datum/target) SIGNAL_HANDLER diff --git a/code/game/objects/effects/decals/cleanable/blood/blood.dm b/code/game/objects/effects/decals/cleanable/blood/blood.dm index 65e05cdca45b..0a845455c8a8 100644 --- a/code/game/objects/effects/decals/cleanable/blood/blood.dm +++ b/code/game/objects/effects/decals/cleanable/blood/blood.dm @@ -43,34 +43,40 @@ dry_start_time = world.time addtimer(CALLBACK(src, PROC_REF(dry)), drying_time * (amount+1)) -/obj/effect/decal/cleanable/blood/Crossed(atom/movable/AM) +/obj/effect/decal/cleanable/blood/Crossed(atom/movable/crossed_by) ..() - if (!apply_bloody_feet) + if(!apply_bloody_feet) return // Check if the blood is dry and only humans // can make footprints - if(!amount || !ishuman(AM) || QDELETED(AM)) + if(!amount) + return + if(QDELETED(crossed_by)) return - if(MODE_HAS_MODIFIER(/datum/gamemode_modifier/blood_optimization)) return + if(!ishuman(crossed_by)) + return - var/mob/living/carbon/human/H = AM - H.add_blood(color, BLOOD_FEET) + var/mob/living/carbon/human/crossing_human = crossed_by + if(crossing_human.stat != CONSCIOUS) + return - var/dry_time_left = 0 - if(drying_time) - dry_time_left = max(0, drying_time - (world.time - dry_start_time)) + crossing_human.add_blood(color, BLOOD_FEET) if(GLOB.perf_flags & PERF_TOGGLE_NOBLOODPRINTS) return - if(!H.bloody_footsteps) - H.AddElement(/datum/element/bloody_feet, dry_time_left, H.shoes, amount, color) + var/dry_time_left = 0 + if(drying_time) + dry_time_left = max(0, drying_time - (world.time - dry_start_time)) + + if(!crossing_human.bloody_footsteps) + crossing_human.AddElement(/datum/element/bloody_feet, dry_time_left, crossing_human.shoes, amount, color) else - SEND_SIGNAL(H, COMSIG_HUMAN_BLOOD_CROSSED, amount, color, dry_time_left) + SEND_SIGNAL(crossing_human, COMSIG_HUMAN_BLOOD_CROSSED, amount, color, dry_time_left) /obj/effect/decal/cleanable/blood/proc/dry() amount = 0