diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index 3315f9e948b..a499a487292 100644
--- a/code/game/dna/dna2.dm
+++ b/code/game/dna/dna2.dm
@@ -74,6 +74,23 @@ var/global/list/datum/dna/gene/dna_genes[0]
// New stuff
var/species = "Human"
+
+// Make a copy of this strand.
+// USE THIS WHEN COPYING STUFF OR YOU'LL GET CORRUPTION!
+/datum/dna/proc/Clone()
+ var/datum/dna/new_dna = new()
+ new_dna.unique_enzymes=unique_enzymes
+ new_dna.b_type=b_type
+ new_dna.mutantrace=mutantrace
+ new_dna.real_name=real_name
+ new_dna.species=species
+ for(var/b=1;b<=STRUCDNASIZE;b++)
+ new_dna.SE[b]=SE[b]
+ if(b<=DNA_UI_LENGTH)
+ new_dna.UI[b]=UI[b]
+ new_dna.UpdateUI()
+ new_dna.UpdateSE()
+
///////////////////////////////////////
// UNIQUE IDENTITY
///////////////////////////////////////
diff --git a/code/game/dna/dna2_domutcheck.dm b/code/game/dna/dna2_domutcheck.dm
index ad790d496bb..df5fba64aa7 100644
--- a/code/game/dna/dna2_domutcheck.dm
+++ b/code/game/dna/dna2_domutcheck.dm
@@ -224,7 +224,7 @@
if(M)
if (M.dna)
- O.dna = M.dna
+ O.dna = M.dna.Clone()
M.dna = null
if (M.suiciding)
@@ -298,7 +298,7 @@
if (M)
if (M.dna)
- O.dna = M.dna
+ O.dna = M.dna.Clone()
M.dna = null
if (M.suiciding)
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index e2b8670886b..fe687c3dc2d 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -737,7 +737,7 @@
if(src.connected.occupant && src.connected.occupant.dna)
var/datum/dna2/record/databuf=new
databuf.types = DNA2_BUF_UE
- databuf.dna = src.connected.occupant.dna
+ databuf.dna = src.connected.occupant.dna.Clone()
databuf.name = "Unique Identifier"
src.buffers[bufferId] = databuf
return 1
@@ -746,7 +746,7 @@
if(src.connected.occupant && src.connected.occupant.dna)
var/datum/dna2/record/databuf=new
databuf.types = DNA2_BUF_UI|DNA2_BUF_UE
- databuf.dna = src.connected.occupant.dna
+ databuf.dna = src.connected.occupant.dna.Clone()
databuf.name = "Unique Identifier + Unique Enzymes"
src.buffers[bufferId] = databuf
return 1
@@ -755,7 +755,7 @@
if(src.connected.occupant && src.connected.occupant.dna)
var/datum/dna2/record/databuf=new
databuf.types = DNA2_BUF_SE
- databuf.dna = src.connected.occupant.dna
+ databuf.dna = src.connected.occupant.dna.Clone()
databuf.name = "Structural Enzymes"
src.buffers[bufferId] = databuf
return 1
diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm
index 952f7df0f48..1ceea87b43c 100644
--- a/code/game/dna/genes/monkey.dm
+++ b/code/game/dna/genes/monkey.dm
@@ -44,7 +44,7 @@
if(M)
if (M.dna)
- O.dna = M.dna
+ O.dna = M.dna.Clone()
M.dna = null
if (M.suiciding)
@@ -119,7 +119,7 @@
if (M)
if (M.dna)
- O.dna = M.dna
+ O.dna = M.dna.Clone()
M.dna = null
if (M.suiciding)
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index 6a45fbc0119..715a75cdbbc 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -188,7 +188,7 @@
changeling.chem_charges -= 5
src.visible_message("[src] transforms!")
changeling.geneticdamage = 30
- src.dna = chosen_dna
+ src.dna = chosen_dna.Clone()
src.real_name = chosen_dna.real_name
src.flavor_text = ""
src.UpdateAppearance()
@@ -240,7 +240,7 @@
del(animation)
var/mob/living/carbon/monkey/O = new /mob/living/carbon/monkey(src)
- O.dna = C.dna
+ O.dna = C.dna.Clone()
C.dna = null
for(var/obj/item/W in C)
@@ -293,7 +293,7 @@
changeling.chem_charges--
C.remove_changeling_powers()
C.visible_message("[C] transforms!")
- C.dna = chosen_dna
+ C.dna = chosen_dna.Clone()
var/list/implants = list()
for (var/obj/item/weapon/implant/I in C) //Still preserving implants
@@ -326,7 +326,7 @@
O.gender = FEMALE
else
O.gender = MALE
- O.dna = C.dna
+ O.dna = C.dna.Clone()
C.dna = null
O.real_name = chosen_dna.real_name
@@ -731,7 +731,7 @@ var/list/datum/dna/hivemind_bank = list()
src << "Our sting appears ineffective against its DNA."
return 0
T.visible_message("[T] transforms!")
- T.dna = chosen_dna
+ T.dna = chosen_dna.Clone()
T.real_name = chosen_dna.real_name
T.UpdateAppearance()
domutcheck(T, null)
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index b5e8462a93d..c66d1ba8045 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -446,9 +446,13 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(record_found)//Pull up their name from database records if they did have a mind.
new_character.dna = new()//Let's first give them a new DNA.
new_character.dna.unique_enzymes = record_found.fields["b_dna"]//Enzymes are based on real name but we'll use the record for conformity.
- new_character.dna.SE = record_found.fields["enzymes"]//This is the default of enzymes so I think it's safe to go with.
+
+ // I HATE BYOND. HATE. HATE. - N3X
+ var/list/newSE= record_found.fields["enzymes"]
+ var/list/newUI = record_found.fields["identity"]
+ new_character.dna.SE = newSE.Copy() //This is the default of enzymes so I think it's safe to go with.
new_character.dna.UpdateSE()
- new_character.UpdateAppearance(record_found.fields["identity"])//Now we configure their appearance based on their unique identity, same as with a DNA machine or somesuch.
+ new_character.UpdateAppearance(newUI.Copy())//Now we configure their appearance based on their unique identity, same as with a DNA machine or somesuch.
else//If they have no records, we just do a random DNA for them, based on their random appearance/savefile.
new_character.dna.ready_dna(new_character)
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index 3ce15937ee3..abc980023f0 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -92,7 +92,7 @@
brainmob = new(src)
brainmob.name = H.real_name
brainmob.real_name = H.real_name
- brainmob.dna = H.dna
+ brainmob.dna = H.dna.Clone()
brainmob.container = src
name = "Man-Machine Interface: [brainmob.real_name]"
@@ -161,4 +161,4 @@
brainmob.emp_damage += rand(10,20)
if(3)
brainmob.emp_damage += rand(0,10)
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm
index 6d3aa5f9acf..ac6d3061b10 100644
--- a/code/modules/mob/living/carbon/brain/brain_item.dm
+++ b/code/modules/mob/living/carbon/brain/brain_item.dm
@@ -28,7 +28,7 @@
brainmob = new(src)
brainmob.name = H.real_name
brainmob.real_name = H.real_name
- brainmob.dna = H.dna
+ brainmob.dna = H.dna.Clone()
brainmob.timeofhostdeath = H.timeofdeath
if(H.mind)
H.mind.transfer_to(brainmob)
@@ -104,4 +104,4 @@
desc = "We barely understand the brains of terrestial animals. Who knows what we may find in the brain of such an advanced species?"
icon = 'icons/mob/alien.dmi'
icon_state = "AlienBrain"
- origin_tech = "biotech=7"
\ No newline at end of file
+ origin_tech = "biotech=7"
diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm
index d4c91e4cfcd..bea08693fbc 100644
--- a/code/modules/mob/mob_transformation_simple.dm
+++ b/code/modules/mob/mob_transformation_simple.dm
@@ -41,7 +41,7 @@
M.real_name = src.real_name
if(src.dna)
- M.dna = src.dna
+ M.dna = src.dna.Clone()
if(mind)
mind.transfer_to(M)
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index d2a1b269bf8..b59459fbb60 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -29,10 +29,7 @@
O = new species.primitive(loc)
- O.dna = dna
- dna = null
- //O.dna.uni_identity = "00600200A00E0110148FC01300B009"
- //O.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
+ O.dna = dna.Clone()
O.dna.SetSEState(MONKEYBLOCK,1)
O.loc = loc
O.viruses = viruses
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index d5a265f417f..d7164378843 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -917,7 +917,7 @@ obj/item/weapon/organ/head/proc/transfer_identity(var/mob/living/carbon/human/H)
brainmob = new(src)
brainmob.name = H.real_name
brainmob.real_name = H.real_name
- brainmob.dna = H.dna
+ brainmob.dna = H.dna.Clone()
if(H.mind)
H.mind.transfer_to(brainmob)
respawnable_list += brainmob