diff --git a/code/modules/antagonists/eldritch_cult/eldritch_items.dm b/code/modules/antagonists/eldritch_cult/eldritch_items.dm
index 7b35f4e71b..6b4a42baf0 100644
--- a/code/modules/antagonists/eldritch_cult/eldritch_items.dm
+++ b/code/modules/antagonists/eldritch_cult/eldritch_items.dm
@@ -6,6 +6,17 @@
w_class = WEIGHT_CLASS_SMALL
///Target
var/mob/living/carbon/human/target
+ var/datum/antagonist/heretic/sac_targetter //The heretic who used this to acquire the current target - gets cleared when target gets sacrificed.
+
+/obj/item/living_heart/Initialize()
+ . = ..()
+ GLOB.living_heart_cache.Add(src) //Add is better than +=.
+
+/obj/item/living_heart/Destroy()
+ GLOB.living_heart_cache.Remove(src)
+ if(sac_targetter && target)
+ sac_targetter.sac_targetted.Remove(target.real_name)
+ return ..()
/obj/item/living_heart/attack_self(mob/user)
. = ..()
diff --git a/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm b/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm
index d25600e92c..d2132be4bc 100644
--- a/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm
+++ b/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm
@@ -267,6 +267,10 @@
LH.target = null
var/datum/antagonist/heretic/EC = carbon_user.mind.has_antag_datum(/datum/antagonist/heretic)
+ EC.actually_sacced.Add(H.real_name)
+ if(LH.sac_targetter)
+ LH.sac_targetter.sac_targetted.Remove(H.real_name)
+ LH.sac_targetter = null
EC.total_sacrifices++
for(var/X in carbon_user.get_all_gear())
if(!istype(X,/obj/item/forbidden_book))
@@ -280,8 +284,14 @@
var/datum/objective/A = new
A.owner = user.mind
var/list/targets = list()
+ var/list/target_blacklist = list()
+ for(var/obj/item/living_heart/CLH in GLOB.living_heart_cache)
+ if(!CLH || !CLH.target || !CLH.target.mind)
+ continue
+ target_blacklist.Add(CLH.target.mind)
+
for(var/i in 0 to 3)
- var/datum/mind/targeted = A.find_target()//easy way, i dont feel like copy pasting that entire block of code
+ var/datum/mind/targeted = A.find_target(blacklist = target_blacklist)//easy way, i dont feel like copy pasting that entire block of code
if(!targeted)
break
targets["[targeted.current.real_name] the [targeted.assigned_role]"] = targeted.current
@@ -289,9 +299,23 @@
if(!LH.target && targets.len)
LH.target = pick(targets) //Tsk tsk, you can and will get another target if you want it or not.
+
+ if(LH.target)
+ target_blacklist = list()
+ for(var/obj/item/living_heart/CLH in (GLOB.living_heart_cache - LH)) //Recreate blacklist, excluding ourselves.
+ if(!CLH || !CLH.target || !CLH.target.mind)
+ continue
+ target_blacklist.Add(CLH.target.mind)
+ if(LH.target.mind in target_blacklist) //Someone was faster, or you tried to cheese the system.
+ to_chat(user, "It seems you were too slow, and your target of choice has already been selected by another living heart!")
+ LH.target = null
+
qdel(A)
if(LH.target)
to_chat(user,"Your new target has been selected, go and sacrifice [LH.target.real_name]!")
+ var/datum/antagonist/heretic/EC = carbon_user.mind.has_antag_datum(/datum/antagonist/heretic)
+ LH.sac_targetter = EC
+ EC.sac_targetted.Add(LH.target.real_name)
else
to_chat(user,"target could not be found for living heart.")