diff --git a/code/datums/spells/summonitem.dm b/code/datums/spells/summonitem.dm
index 2e7d3d8278a..b5bbdd08608 100644
--- a/code/datums/spells/summonitem.dm
+++ b/code/datums/spells/summonitem.dm
@@ -79,7 +79,7 @@
for(var/X in C.bodyparts)
var/obj/item/organ/external/part = X
if(item_to_retrieve in part.embedded_objects)
- part.embedded_objects -= item_to_retrieve
+ part.remove_embedded_object(item_to_retrieve)
to_chat(C, "\The [item_to_retrieve] that was embedded in your [part] has mysteriously vanished. How fortunate!")
if(!C.has_embedded_objects())
C.clear_alert("embeddedobject")
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 68e29086ce1..6f0b582f885 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -613,7 +613,7 @@
if(do_after(usr, time_taken, needhand = 1, target = src))
if(!I || !L || I.loc != src || !(I in L.embedded_objects))
return
- L.embedded_objects -= I
+ L.remove_embedded_object(I)
L.receive_damage(I.embedded_unsafe_removal_pain_multiplier*I.w_class)//It hurts to rip it out, get surgery you dingus.
I.forceMove(get_turf(src))
usr.put_in_hands(I)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 29708f16c78..51379830c49 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -549,9 +549,8 @@ emp_act
if(prob(I.embed_chance) && !HAS_TRAIT(src, TRAIT_PIERCEIMMUNE))
throw_alert("embeddedobject", /obj/screen/alert/embeddedobject)
var/obj/item/organ/external/L = pick(bodyparts)
- L.embedded_objects |= I
+ L.add_embedded_object(I)
I.add_mob_blood(src)//it embedded itself in you, of course it's bloody!
- I.forceMove(src)
L.receive_damage(I.w_class*I.embedded_impact_pain_multiplier)
visible_message("[I] embeds itself in [src]'s [L.name]!","[I] embeds itself in your [L.name]!")
hitpush = FALSE
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 7d27dc92209..6a6aa7700c8 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -838,7 +838,7 @@
if(prob(I.embedded_fall_chance))
BP.receive_damage(I.w_class*I.embedded_fall_pain_multiplier)
- BP.embedded_objects -= I
+ BP.remove_embedded_object(I)
I.forceMove(get_turf(src))
visible_message("[I] falls out of [name]'s [BP.name]!","[I] falls out of your [BP.name]!")
if(!has_embedded_objects())
diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm
index f84219fc898..a44e3c1242d 100644
--- a/code/modules/surgery/organs/organ_external.dm
+++ b/code/modules/surgery/organs/organ_external.dm
@@ -94,6 +94,14 @@
return ..()
+/obj/item/organ/external/examine(mob/user)
+ . = ..()
+
+ var/list/embedded_names = list()
+ for(var/obj/item/I in embedded_objects)
+ embedded_names += "[I]"
+ if(length(embedded_names))
+ . += "You can see [english_list(embedded_names)] embedded."
/obj/item/organ/external/update_health()
damage = min(max_damage, (brute_dam + burn_dam))
@@ -574,6 +582,7 @@ Note that amputating the affected organ does in fact remove the infection from t
"You begin to cut open [src]...")
if(do_after(user, 54, target = src))
drop_organs(user)
+ drop_embedded_objects()
else
return ..()
@@ -719,8 +728,10 @@ Note that amputating the affected organ does in fact remove the infection from t
victim.splinted_limbs -= src
for(var/obj/item/I in embedded_objects)
- embedded_objects -= I
+ UnregisterSignal(I, COMSIG_MOVABLE_MOVED) // Else it gets removed from the embedded list
I.forceMove(src)
+ RegisterSignal(I, COMSIG_MOVABLE_MOVED, .proc/remove_embedded_object)
+
if(!owner.has_embedded_objects())
owner.clear_alert("embeddedobject")
@@ -799,6 +810,21 @@ Note that amputating the affected organ does in fact remove the infection from t
if(data["dna"])
sync_colour_to_dna()
+/obj/item/organ/external/proc/remove_embedded_object(obj/item/I)
+ embedded_objects -= I
+ UnregisterSignal(I, COMSIG_MOVABLE_MOVED)
+
+/obj/item/organ/external/proc/drop_embedded_objects()
+ var/turf/T = get_turf(src)
+ for(var/obj/item/I in embedded_objects)
+ remove_embedded_object(I)
+ forceMove(T)
+
+/obj/item/organ/external/proc/add_embedded_object(obj/item/I)
+ embedded_objects += I
+ I.forceMove(owner)
+ RegisterSignal(I, COMSIG_MOVABLE_MOVED, .proc/remove_embedded_object)
+
//Remove all embedded objects from all limbs on the carbon mob
/mob/living/carbon/human/proc/remove_all_embedded_objects()
var/turf/T = get_turf(src)
@@ -806,7 +832,7 @@ Note that amputating the affected organ does in fact remove the infection from t
for(var/X in bodyparts)
var/obj/item/organ/external/L = X
for(var/obj/item/I in L.embedded_objects)
- L.embedded_objects -= I
+ L.remove_embedded_object(I)
I.forceMove(T)
clear_alert("embeddedobject")
diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm
index 2040138640f..098e92ca4af 100644
--- a/code/modules/surgery/remove_embedded_object.dm
+++ b/code/modules/surgery/remove_embedded_object.dm
@@ -50,8 +50,8 @@
var/objects = 0
for(var/obj/item/I in L.embedded_objects)
objects++
+ L.remove_embedded_object(I)
I.forceMove(get_turf(H))
- L.embedded_objects -= I
if(!H.has_embedded_objects())
H.clear_alert("embeddedobject")