diff --git a/code/modules/medical/cloning.dm b/code/modules/medical/cloning.dm
index c8202f8b724..ff602c49584 100644
--- a/code/modules/medical/cloning.dm
+++ b/code/modules/medical/cloning.dm
@@ -193,7 +193,7 @@
if(clonemind.current.stat != DEAD) //mind is associated with a non-dead body
return FALSE
if(clonemind.active) //somebody is using that mind
- if( ckey(clonemind.key)!=R.ckey )
+ if(ckey(clonemind.key)!=R.ckey )
return FALSE
else
for(var/mob/G in player_list)
@@ -201,6 +201,10 @@
if(isobserver(G))
if(G:can_reenter_corpse)
break
+ if((!G.mind.current) && G.mind.body_archive) //If the mind's body was destroyed and that mind has a body archive
+ var/datum/dna2/record/D = G.mind.body_archive.data["dna_records"] //Retrieve the DNA records from the mind's body archive
+ if((D.id == R.id) || D.ckey == R.ckey) //If the MD5 hash of the mind's real_name matches the record's real_name (stored as the id variable), or if the ckeys match
+ break //Proceed with cloning. This set of checks is to allow cloning players with completely destroyed bodies, that nevertheless had cloning data stored
else
return FALSE
else if(G)
diff --git a/code/modules/medical/computer/cloning.dm b/code/modules/medical/computer/cloning.dm
index 5b24abc1905..5fbc8aab05e 100644
--- a/code/modules/medical/computer/cloning.dm
+++ b/code/modules/medical/computer/cloning.dm
@@ -338,35 +338,31 @@
//Can't clone without someone to clone. Or a pod. Or if the pod is busy. Or full of gibs.
if(!pod1 || !canLink(pod1)) //If the pod exists BUT it's too far away from the console
temp = "Error: No Clonepod detected."
+ return
else if(pod1.occupant)
temp = "Error: Clonepod is currently occupied."
+ return
else if(pod1.biomass < CLONE_BIOMASS)
temp = "Error: Not enough biomass."
+ return
else if(pod1.mess)
temp = "Error: Clonepod malfunction."
+ return
else if(!config.revival_cloning)
temp = "Error: Unable to initiate cloning cycle."
+ return
+
+ if(pod1.growclone(C))
+ temp = "Initiating cloning cycle..."
+ records.Remove(C)
+ QDEL_NULL(C)
+ menu = 1
+
else
- if(pod1.growclone(C))
- temp = "Initiating cloning cycle..."
- records.Remove(C)
- QDEL_NULL(C)
- menu = 1
- else
- //if growclone() failed, we can't clone the guy, so what is this even DOING here?
- var/mob/selected = find_dead_player("[C.ckey]")
- if(!selected)
- temp = "Initiating cloning cycle...
Error: Post-initialisation failed. Cloning cycle aborted."
- src.updateUsrDialog()
- return
- selected << 'sound/effects/adminhelp.ogg'
- if(alert(selected,"Your DNA has been selected for cloning. Do you want to return to life?","Cloning","Yes","No") == "Yes" && pod1.growclone(C))
- temp = "Initiating cloning cycle..."
- records.Remove(C)
- QDEL_NULL(C)
- menu = 1
- else
- temp = "Initiating cloning cycle...
Error: Post-initialisation failed. Cloning cycle aborted."
+ temp = "Initiating cloning cycle...
Error: Post-initialisation failed. Cloning cycle aborted."
+ src.updateUsrDialog()
+ return
+
else
temp = "Error: Data corruption."
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index c906d4f8cee..d82eaa392a0 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -131,7 +131,7 @@
dorfpod.scan_body(src)
if(ticker && ticker.mode)
sql_report_death(src)
- species.handle_death(src)
+ species.handle_death(src, gibbed)
if(become_zombie)
spawn(20 SECONDS)
if(!gcDestroyed)
diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm
index 63e79319a43..0c55c897383 100644
--- a/code/modules/mob/living/carbon/species.dm
+++ b/code/modules/mob/living/carbon/species.dm
@@ -282,7 +282,7 @@ var/global/list/playable_species = list("Human")
else
return capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
-/datum/species/proc/handle_death(var/mob/living/carbon/human/H) //Handles any species-specific death events (such as dionaea nymph spawns).
+/datum/species/proc/handle_death(var/mob/living/carbon/human/H, var/gibbed = 0) //Handles any species-specific death events (such as dionaea nymph spawns).
return
/datum/species/proc/can_artifact_revive()
@@ -1111,11 +1111,35 @@ var/list/has_died_as_golem = list()
"brain" = /datum/organ/internal/brain/slime_core,
)
-/datum/species/slime/handle_death(var/mob/living/carbon/human/H) //Handles any species-specific death events (such as dionaea nymph spawns).
- H.dropBorers()
+/datum/species/slime/handle_death(var/mob/living/carbon/human/H, gibbed) //Handles any species-specific death events (such as dionaea nymph spawns).
+ H.dropBorers(gibbed)
for(var/atom/movable/I in H.contents)
I.forceMove(H.loc)
anim(target = H, a_icon = 'icons/mob/mob.dmi', flick_anim = "liquify", sleeptime = 15)
+ if(!gibbed)
+ handle_slime_puddle(H)
+
+/datum/species/slime/gib(mob/living/carbon/human/H)
+ handle_slime_puddle(H)
+ ..()
+ H.monkeyizing = TRUE
+ for(var/datum/organ/external/E in H.organs)
+ if(istype(E, /datum/organ/external/chest) || istype(E, /datum/organ/external/groin) || istype(E, /datum/organ/external/head))
+ continue
+ //Only make the limb drop if it's not too damaged
+ if(prob(100 - E.get_damage()))
+ //Override the current limb status and don't cause an explosion
+ E.droplimb(1, 1)
+ var/gib_radius = 0
+ if(H.reagents.has_reagent(LUBE))
+ gib_radius = 6
+
+ anim(target = H, a_icon = 'icons/mob/mob.dmi', flick_anim = "gibbed-h", sleeptime = 15)
+ hgibs(H.loc, H.virus2, H.dna, flesh_color, blood_color, gib_radius)
+
+/datum/species/slime/proc/handle_slime_puddle(var/mob/living/carbon/human/H)
+ if(!H)
+ return
var/mob/living/slime_pile/S = new(H.loc)
if(H.real_name)
S.real_name = H.real_name
@@ -1127,10 +1151,6 @@ var/list/has_died_as_golem = list()
S.dna=H.dna
S.mind=H.mind
-/datum/species/slime/gib(mob/living/carbon/human/H)
- ..()
- H.default_gib()
-
/mob/living/slime_pile //serves as the corpse of slime people
name = "puddle of slime"
desc = "The remains of a slime person."