diff --git a/code/_helpers/mobs.dm b/code/_helpers/mobs.dm index 62a1b56b26..6ef4b78f1a 100644 --- a/code/_helpers/mobs.dm +++ b/code/_helpers/mobs.dm @@ -248,7 +248,7 @@ Proc for attack log creation, because really why not . = FALSE break - if(target_zone && user.zone_sel.selecting != target_zone) + if(target_zone && user.zone_sel?.selecting != target_zone) . = FALSE break diff --git a/code/_macros.dm b/code/_macros.dm index 8dc5bdaf74..c5093110f5 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -33,6 +33,8 @@ #define qdel_null(x) if(x) { qdel(x) ; x = null } +#define qdel_swap(x,y) if(x) { qdel(x) }; x = y; + #define sequential_id(key) uniqueness_repository.Generate(/datum/uniqueness_generator/id_sequential, key) #define random_id(key,min_id,max_id) uniqueness_repository.Generate(/datum/uniqueness_generator/id_random, key, min_id, max_id) diff --git a/code/controllers/subsystems/transcore_vr.dm b/code/controllers/subsystems/transcore_vr.dm index 5d4060c149..b5b734b0d0 100644 --- a/code/controllers/subsystems/transcore_vr.dm +++ b/code/controllers/subsystems/transcore_vr.dm @@ -282,6 +282,8 @@ SUBSYSTEM_DEF(transcore) // Called from body_record to add itself to the transcore. /datum/transcore_db/proc/add_body(var/datum/transhuman/body_record/BR) ASSERT(BR) + if(body_scans[BR.mydna.name]) + qdel(body_scans[BR.mydna.name]) body_scans[BR.mydna.name] = BR body_scans = sortAssoc(body_scans) log_debug("Added [BR.mydna.name] to transcore body DB.") diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 0d0c0a9bbd..e2b9e5dcb8 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -40,7 +40,7 @@ /datum/dna2/record/proc/copy() var/datum/dna2/record/newrecord = new /datum/dna2/record - newrecord.dna = dna.Clone() + qdel_swap(newrecord.dna, dna.Clone()) newrecord.types = types newrecord.name = name newrecord.mind = mind diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm index 959c0cc2f2..08bc48383f 100644 --- a/code/game/dna/genes/monkey.dm +++ b/code/game/dna/genes/monkey.dm @@ -45,8 +45,8 @@ if(M) if (M.dna) - O.dna = M.dna.Clone() - M.dna = null + qdel_swap(O.dna, M.dna.Clone()) + QDEL_NULL(M.dna) if (M.suiciding) O.suiciding = M.suiciding @@ -116,8 +116,8 @@ if (M) if (M.dna) - O.dna = M.dna.Clone() - M.dna = null + qdel_swap(O.dna, M.dna.Clone()) + QDEL_NULL(M.dna) if (M.suiciding) O.suiciding = M.suiciding diff --git a/code/game/gamemodes/changeling/absorbed_dna.dm b/code/game/gamemodes/changeling/absorbed_dna.dm index 26d433cd8c..5c365f9add 100644 --- a/code/game/gamemodes/changeling/absorbed_dna.dm +++ b/code/game/gamemodes/changeling/absorbed_dna.dm @@ -10,9 +10,13 @@ /datum/absorbed_dna/New(var/newName, var/newDNA, var/newSpecies, var/newLanguages, var/newIdentifying_Gender, var/list/newFlavour, var/list/newGenMods) ..() name = newName - dna = newDNA + qdel_swap(dna, newDNA) speciesName = newSpecies languages = newLanguages identifying_gender = newIdentifying_Gender flavour_texts = newFlavour ? newFlavour.Copy() : null - genMods = newGenMods ? newGenMods.Copy() : null \ No newline at end of file + genMods = newGenMods ? newGenMods.Copy() : null + +/datum/absorbed_dna/Destroy() + . = ..() + qdel(dna) diff --git a/code/game/gamemodes/changeling/powers/lesser_form.dm b/code/game/gamemodes/changeling/powers/lesser_form.dm index 9bac29f797..ff8b553985 100644 --- a/code/game/gamemodes/changeling/powers/lesser_form.dm +++ b/code/game/gamemodes/changeling/powers/lesser_form.dm @@ -58,7 +58,7 @@ changeling.chem_charges-- C.remove_changeling_powers() C.visible_message(span_warning("[C] transforms!")) - C.dna = chosen_dna.Clone() + qdel_swap(C.dna, chosen_dna.Clone()) var/list/implants = list() for (var/obj/item/implant/I in C) //Still preserving implants @@ -85,8 +85,8 @@ O.gender = FEMALE else O.gender = MALE - O.dna = C.dna.Clone() - C.dna = null + qdel_swap(O.dna, C.dna.Clone()) + QDEL_NULL(C.dna) O.real_name = chosen_dna.real_name for(var/obj/T in C) diff --git a/code/game/gamemodes/changeling/powers/transform.dm b/code/game/gamemodes/changeling/powers/transform.dm index 4bf04341ef..69a7fe6fe9 100644 --- a/code/game/gamemodes/changeling/powers/transform.dm +++ b/code/game/gamemodes/changeling/powers/transform.dm @@ -37,7 +37,7 @@ var/newSpecies = chosen_dna.speciesName H.set_species(newSpecies,1) - src.dna = chosen_dna.dna.Clone() + qdel_swap(src.dna, chosen_dna.dna.Clone()) src.dna.b_type = "AB+" //This is needed to avoid blood rejection bugs. The fact that the blood type might not match up w/ records could be a *FEATURE* too. if(ishuman(src)) var/mob/living/carbon/human/H = src diff --git a/code/game/gamemodes/changeling/powers/transform_sting.dm b/code/game/gamemodes/changeling/powers/transform_sting.dm index ced7d1c3c6..5b4e99f5b2 100644 --- a/code/game/gamemodes/changeling/powers/transform_sting.dm +++ b/code/game/gamemodes/changeling/powers/transform_sting.dm @@ -36,7 +36,7 @@ return 0 add_attack_logs(src,T,"Transformation sting (changeling)") T.visible_message(span_warning("[T] transforms!")) - T.dna = chosen_dna.Clone() + qdel_swap(T.dna, chosen_dna.Clone()) T.real_name = chosen_dna.real_name T.UpdateAppearance() domutcheck(T, null) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index d7576fdae4..d4ddcbc154 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -130,9 +130,9 @@ if(!R.dna) H.dna = new /datum/dna() - H.dna.real_name = H.real_name + qdel_swap(H.dna, new /datum/dna()) else - H.dna = R.dna + qdel_swap(H.dna, R.dna) H.UpdateAppearance() H.sync_organ_dna() if(heal_level < 60) diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 33403bbfc4..5779f05c18 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -34,6 +34,9 @@ /obj/machinery/computer/cloning/Destroy() releasecloner() + for(var/datum/dna2/record/R in records) + qdel(R.dna) + qdel(R) return ..() /obj/machinery/computer/cloning/process() @@ -210,6 +213,7 @@ return if(check_access(C)) records.Remove(active_record) + qdel(active_record.dna) qdel(active_record) set_temp("Record deleted.", "success") menu = MENU_RECORDS @@ -344,6 +348,7 @@ set_temp("Initiating cloning cycle...", "success") playsound(src, 'sound/machines/medbayscanner1.ogg', 100, 1) records.Remove(C) + qdel(C.dna) qdel(C) menu = MENU_MAIN else @@ -423,7 +428,7 @@ subject.dna.check_integrity() var/datum/dna2/record/R = new /datum/dna2/record() - R.dna = subject.dna + qdel_swap(R.dna, subject.dna) R.ckey = subject.ckey R.id = copytext(md5(subject.real_name), 2, 6) R.name = R.dna.real_name diff --git a/code/modules/artifice/deadringer.dm b/code/modules/artifice/deadringer.dm index e154588efb..64aedade07 100644 --- a/code/modules/artifice/deadringer.dm +++ b/code/modules/artifice/deadringer.dm @@ -81,8 +81,6 @@ if(!D.has_AI()) continue D.ai_holder.lose_target() - - watchowner.emote("deathgasp") watchowner.alpha = 15 makeacorpse(watchowner) return @@ -97,7 +95,8 @@ if(H.isSynthetic()) return corpse = new /mob/living/carbon/human(H.loc) - corpse.setDNA(H.dna.Clone()) + qdel_swap(corpse.dna,H.dna.Clone()) + corpse.emote("deathgasp") corpse.death(1) //Kills the new mob var/obj/item/clothing/temp = null if(H.get_equipped_item(slot_w_uniform)) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 6a872d1cd5..555e4dbb8c 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -315,6 +315,8 @@ var/list/preferences_datums = list() else if(href_list["close"]) // User closed preferences window, cleanup anything we need to. clear_character_previews() + if(GLOB.mannequins[client_ckey]) + qdel_null(GLOB.mannequins[client_ckey]) return 1 else return 0 diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index d0f4aef575..83aca64cbd 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -124,7 +124,7 @@ brainmob = new(src) brainmob.name = H.real_name brainmob.real_name = H.real_name - brainmob.dna = H.dna + qdel_swap(brainmob.dna, H.dna.Clone()) brainmob.container = src // Copy modifiers. @@ -227,7 +227,7 @@ ..() /obj/item/mmi/digital/transfer_identity(var/mob/living/carbon/H) - brainmob.dna = H.dna + qdel_swap(brainmob.dna, H.dna.Clone()) brainmob.timeofhostdeath = H.timeofdeath brainmob.set_stat(CONSCIOUS) if(H.mind) diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index c56f1578bd..6f7474529d 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -24,6 +24,7 @@ if(stat != DEAD) //If not dead. death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA ghostize() //Ghostize checks for key so nothing else is necessary. + qdel(dna) return ..() /mob/living/carbon/brain/say_understands(var/other)//Goddamn is this hackish, but this say code is so odd diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index 6397b86fc1..fcd6781b63 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -173,7 +173,7 @@ check_dna() dna.ready_dna(src) for(var/obj/item/organ/O in organs) - O.dna = dna // Update all of those because apparently they're separate, and icons won't update properly + qdel_swap(O.dna, dna.Clone()) // Update all of those because apparently they're separate, and icons won't update properly /mob/living/carbon/human/proc/generate_valid_species(var/check_whitelist = 1, var/list/whitelist = list(), var/list/blacklist = list()) var/list/valid_species = new() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index d60c125dbc..ce918a252a 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1310,18 +1310,16 @@ var/datum/mob_descriptor/descriptor = species.descriptors[desctype] descriptors[desctype] = descriptor.default_value - spawn(0) - if(regen_icons) regenerate_icons() - make_blood() - if(vessel.total_volume < species.blood_volume) - vessel.maximum_volume = species.blood_volume - vessel.add_reagent(REAGENT_ID_BLOOD, species.blood_volume - vessel.total_volume) - else if(vessel.total_volume > species.blood_volume) - vessel.remove_reagent(REAGENT_ID_BLOOD,vessel.total_volume - species.blood_volume) //This one should stay remove_reagent to work even lack of a O_heart - vessel.maximum_volume = species.blood_volume - fixblood() - species.update_attack_types() //VOREStation Edit - Required for any trait that updates unarmed_types in setup. - species.update_vore_belly_def_variant() + make_blood() + if(vessel.total_volume < species.blood_volume) + vessel.maximum_volume = species.blood_volume + vessel.add_reagent(REAGENT_ID_BLOOD, species.blood_volume - vessel.total_volume) + else if(vessel.total_volume > species.blood_volume) + vessel.remove_reagent(REAGENT_ID_BLOOD,vessel.total_volume - species.blood_volume) //This one should stay remove_reagent to work even lack of a O_heart + vessel.maximum_volume = species.blood_volume + fixblood() + species.update_attack_types() //Required for any trait that updates unarmed_types in setup. + species.update_vore_belly_def_variant() // Rebuild the HUD. If they aren't logged in then login() should reinstantiate it for them. update_hud() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index e472b3a2e1..6ef8edfe79 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -12,10 +12,10 @@ client.screen = list() if(mind && mind.current == src) spellremove(src) - if(!istype(src,/mob/observer)) //CHOMPEdit - ghostize() //CHOMPEdit - //ChompEDIT start - fix hard qdels - QDEL_NULL(soulgem) //CHOMPAdd + if(!istype(src,/mob/observer)) + ghostize() + QDEL_NULL(soulgem) // CHOMPAdd Soulcatcher + QDEL_NULL(dna) QDEL_NULL(plane_holder) QDEL_NULL(hud_used) for(var/key in alerts) //clear out alerts @@ -23,6 +23,12 @@ if(pulling) stop_pulling() //TG does this on atom/movable but our stop_pulling proc is here so whatever + vore_selected = null + if(vore_organs) + QDEL_NULL_LIST(vore_organs) + if(vorePanel) + QDEL_NULL(vorePanel) + previewing_belly = null // from code/modules/vore/eating/mob_ch.dm vore_selected = null // from code/modules/vore/eating/mob_vr focus = null @@ -37,6 +43,7 @@ update_client_z(null) //return QDEL_HINT_HARDDEL_NOW + /mob/proc/remove_screen_obj_references() hands = null pullin = null diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm index aef3310dd6..b39adaa3b1 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.Clone() + qdel_swap(M.dna, src.dna.Clone()) if(mind) mind.transfer_to(M) diff --git a/code/modules/nifsoft/software/13_soulcatcher.dm b/code/modules/nifsoft/software/13_soulcatcher.dm index cf400b847e..640ff68755 100644 --- a/code/modules/nifsoft/software/13_soulcatcher.dm +++ b/code/modules/nifsoft/software/13_soulcatcher.dm @@ -240,7 +240,7 @@ //If they have these values, apply them if(ishuman(M)) var/mob/living/carbon/human/H = M - brainmob.dna = H.dna + qdel_swap(brainmob.dna, H.dna.Clone()) brainmob.ooc_notes = H.ooc_notes brainmob.ooc_notes_likes = H.ooc_notes_likes brainmob.ooc_notes_dislikes = H.ooc_notes_dislikes diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index e7aa49dcad..69bc369fad 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -90,6 +90,8 @@ GLOBAL_LIST_BOILERPLATE(all_brain_organs, /obj/item/organ/internal/brain) brainmob.client.screen.len = null //clear the hud /obj/item/organ/internal/brain/Destroy() + if(brainmob && brainmob.dna) + qdel(brainmob.dna) QDEL_NULL(brainmob) . = ..() @@ -101,7 +103,7 @@ GLOBAL_LIST_BOILERPLATE(all_brain_organs, /obj/item/organ/internal/brain) brainmob.real_name = H.real_name if(istype(H)) - brainmob.dna = H.dna.Clone() + qdel_swap(brainmob.dna, H.dna.Clone()) brainmob.timeofhostdeath = H.timeofdeath brainmob.ooc_notes = H.ooc_notes //VOREStation Edit brainmob.ooc_notes_likes = H.ooc_notes_likes @@ -213,7 +215,7 @@ GLOBAL_LIST_BOILERPLATE(all_brain_organs, /obj/item/organ/internal/brain) /obj/item/organ/internal/brain/slime/proc/reviveBody() var/datum/dna2/record/R = new /datum/dna2/record() - R.dna = brainmob.dna + qdel_swap(R.dna, brainmob.dna.Clone()) R.ckey = brainmob.ckey R.id = copytext(md5(brainmob.real_name), 2, 6) R.name = R.dna.real_name @@ -253,7 +255,7 @@ GLOBAL_LIST_BOILERPLATE(all_brain_organs, /obj/item/organ/internal/brain) H.dna = new /datum/dna() H.dna.real_name = H.real_name else - H.dna = R.dna + qdel_swap(H.dna, R.dna.Clone()) H.UpdateAppearance() H.sync_organ_dna() @@ -287,6 +289,8 @@ GLOBAL_LIST_BOILERPLATE(all_brain_organs, /obj/item/organ/internal/brain) for(var/datum/language/L in R.languages) H.add_language(L.name) H.flavor_texts = R.flavor.Copy() + qdel(R.dna) + qdel(R) qdel(src) return 1 diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 3f3d3cbfc3..d372a72051 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -54,7 +54,7 @@ var/list/organ_cache = list() if(transplant_data) transplant_data.Cut() if(autopsy_data) autopsy_data.Cut() if(trace_chemicals) trace_chemicals.Cut() - dna = null + QDEL_NULL(dna) species = null return ..() @@ -93,8 +93,8 @@ var/list/organ_cache = list() var/mob/living/carbon/C = holder species = GLOB.all_species[SPECIES_HUMAN] if(holder.dna) - dna = C.dna.Clone() - species = C.species //VOREStation Edit - For custom species + qdel_swap(dna, C.dna.Clone()) + species = C.species else log_debug("[src] at [loc] spawned without a proper DNA.") var/mob/living/carbon/human/H = C @@ -131,7 +131,7 @@ var/list/organ_cache = list() /obj/item/organ/proc/set_dna(var/datum/dna/new_dna) if(new_dna) - dna = new_dna.Clone() + qdel_swap(dna, new_dna.Clone()) if(blood_DNA) blood_DNA.Cut() blood_DNA[dna.unique_enzymes] = dna.b_type diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 372b5a2dd8..3754280a6e 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -95,6 +95,9 @@ parent.children -= src parent = null + if(wounds) + QDEL_LIST(wounds) + if(children) for(var/obj/item/organ/external/C in children) children -= C diff --git a/code/modules/projectiles/dnalocking.dm b/code/modules/projectiles/dnalocking.dm index c4527f28b4..11085e8703 100644 --- a/code/modules/projectiles/dnalocking.dm +++ b/code/modules/projectiles/dnalocking.dm @@ -12,19 +12,21 @@ var/controller_lock = 0 //whether or not the gun is locked by the primar controller, 0 or 1, at 1 it is locked and does not allow var/exploding = 0 +/obj/item/dnalockingchip/Destroy(force, ...) + . = ..() /obj/item/gun/proc/get_dna(mob/user) var/mob/living/M = user if(!attached_lock.controller_lock) - if(!attached_lock.stored_dna && !(M.dna in attached_lock.stored_dna)) + if(attached_lock.stored_dna && (M.dna.unique_enzymes in attached_lock.stored_dna)) to_chat(M, span_warning("\The [src] buzzes and displays a symbol showing the gun already contains your DNA.")) return 0 else - attached_lock.stored_dna += M.dna + attached_lock.stored_dna += M.dna.unique_enzymes to_chat(M, span_notice("\The [src] pings and a needle flicks out from the grip, taking a DNA sample from you.")) if(!attached_lock.controller_dna) - attached_lock.controller_dna = M.dna + attached_lock.controller_dna = M.dna.unique_enzymes to_chat(M, span_notice("\The [src] processes the dna sample and pings, acknowledging you as the primary controller.")) return 1 else @@ -44,10 +46,9 @@ to_chat(M, span_warning("\The [src] buzzes and displays an invalid user symbol.")) return 0 else - attached_lock.stored_dna -= user.dna + attached_lock.stored_dna -= user.dna.unique_enzymes to_chat(M, span_notice("\The [src] beeps and clears the DNA it has stored.")) - if(M.dna == attached_lock.controller_dna) - attached_lock.controller_dna = null + if(M.dna.unique_enzymes == attached_lock.controller_dna) to_chat(M, span_notice("\The [src] beeps and removes you as the primary controller.")) if(attached_lock.controller_lock) attached_lock.controller_lock = 0 @@ -64,7 +65,7 @@ /obj/item/gun/proc/toggledna(mob/user) var/mob/living/M = user - if(authorized_user(M) && user.dna == attached_lock.controller_dna) + if(authorized_user(M) && user.dna.unique_enzymes == attached_lock.controller_dna) if(!attached_lock.controller_lock) attached_lock.controller_lock = 1 to_chat(M, span_notice("\The [src] beeps and displays a locked symbol, informing you it will no longer allow DNA samples.")) @@ -83,6 +84,6 @@ /obj/item/gun/proc/authorized_user(mob/user) if(!attached_lock.stored_dna || !attached_lock.stored_dna.len) return 1 - if(!(user.dna in attached_lock.stored_dna)) + if(!(user.dna.unique_enzymes in attached_lock.stored_dna)) return 0 return 1 diff --git a/code/modules/research/prosfab_designs.dm b/code/modules/research/prosfab_designs.dm index d8b16d7038..11e0235cdc 100644 --- a/code/modules/research/prosfab_designs.dm +++ b/code/modules/research/prosfab_designs.dm @@ -27,11 +27,9 @@ else O.species = GLOB.all_species["Human"] O.robotize(prosfab.manufacturer) - O.dna = new/datum/dna() //Uuughhhh... why do I have to do this? + qdel_swap(O.dna, new/datum/dna()) //Uuughhhh... why do I have to do this? O.dna.ResetUI() O.dna.ResetSE() - spawn(10) //Limbs love to flop around. Who am I to deny them? - O.dir = 2 return O return ..() @@ -68,7 +66,7 @@ manf = all_robolimbs["Unbranded"] O.robotize(manf.company) - O.dna = new/datum/dna() + qdel_swap(O.dna, new/datum/dna()) O.dna.ResetUI() O.dna.ResetSE() diff --git a/code/modules/resleeving/designer.dm b/code/modules/resleeving/designer.dm index 6a82096a83..adb0ebcd58 100644 --- a/code/modules/resleeving/designer.dm +++ b/code/modules/resleeving/designer.dm @@ -402,7 +402,7 @@ I.digitize() // Apply DNA - H.dna = R.dna.Clone() + qdel_swap(H.dna, R.dna.Clone()) H.UpdateAppearance() // Update all appearance stuff from the DNA record // H.sync_dna_traits(FALSE) // Traitgenes edit - Sync traits to genetics if needed // Currently not implemented H.sync_organ_dna() // Do this because sprites depend on DNA-gender of organs (chest etc) diff --git a/code/modules/resleeving/infocore_records.dm b/code/modules/resleeving/infocore_records.dm index 16387494f0..0eb7eefee7 100644 --- a/code/modules/resleeving/infocore_records.dm +++ b/code/modules/resleeving/infocore_records.dm @@ -113,7 +113,8 @@ init_from_mob(copyfrom, add_to_db, ckeylock) /datum/transhuman/body_record/Destroy() - mydna = null + qdel_null(mydna.dna) + qdel_null(mydna) client_ref = null mind_ref = null limb_data.Cut() @@ -153,7 +154,7 @@ //The DNA2 stuff mydna = new () - mydna.dna = M.dna.Clone() + qdel_swap(mydna.dna, M.dna.Clone()) mydna.ckey = M.ckey mydna.id = copytext(md5(M.real_name), 2, 6) mydna.name = M.dna.real_name @@ -224,7 +225,7 @@ ASSERT(!QDELETED(orig)) ASSERT(istype(orig)) src.mydna = new () - src.mydna.dna = orig.mydna.dna.Clone() + qdel_swap(src.mydna.dna, orig.mydna.dna.Clone()) src.mydna.ckey = orig.mydna.ckey src.mydna.id = orig.mydna.id src.mydna.name = orig.mydna.name diff --git a/code/modules/resleeving/machines.dm b/code/modules/resleeving/machines.dm index d8dbeb4a4d..b6517f52c9 100644 --- a/code/modules/resleeving/machines.dm +++ b/code/modules/resleeving/machines.dm @@ -98,7 +98,7 @@ H.real_name = R.dna.real_name //Apply DNA - H.dna = R.dna.Clone() + qdel_swap(H.dna, R.dna.Clone()) H.original_player = current_project.ckey //Apply genetic modifiers @@ -354,7 +354,7 @@ H.real_name = R.dna.real_name //Apply DNA - H.dna = R.dna.Clone() + qdel_swap(H.dna, R.dna.Clone()) H.original_player = current_project.ckey //Apply damage diff --git a/code/modules/vore/eating/mob_ch.dm b/code/modules/vore/eating/mob_ch.dm index ee67f26d56..08b15dbbf0 100644 --- a/code/modules/vore/eating/mob_ch.dm +++ b/code/modules/vore/eating/mob_ch.dm @@ -15,5 +15,3 @@ var/no_latejoin_prey_warning_persists = FALSE //Do we save it? var/belly_rub_target = null var/soulcatcher_pref_flags = 0 //Default disabled - - var/obj/soulgem/soulgem diff --git a/code/modules/vore/eating/mob_vr.dm b/code/modules/vore/eating/mob_vr.dm index 96236396e5..90a5235ccf 100644 --- a/code/modules/vore/eating/mob_vr.dm +++ b/code/modules/vore/eating/mob_vr.dm @@ -68,3 +68,5 @@ var/vore_icons = 0 // Bitfield for which fields we have vore icons for. var/vore_eyes = FALSE // For mobs with fullness specific eye overlays. + + var/obj/soulgem/soulgem // CHOMPEnable Soulcatcher. Needs to be up-ported sometime. diff --git a/code/unit_tests/zz_tests.dm b/code/unit_tests/zz_tests.dm new file mode 100644 index 0000000000..39f904ce03 --- /dev/null +++ b/code/unit_tests/zz_tests.dm @@ -0,0 +1,30 @@ +///NOTE: LEAVE THIS FILE UNTICKED AND THE SEGMENTS OF CODE COMMENTED OUT UNLESS YOU NEED TO DO SOMETHING SPECIFIC / TRACK SOMETHING SPECIFIC. + + +/* +/// Testing if DNA & Species datums get destoryed or not. Use this as a basis to test for memory leaks. +/// This happens if DNA is copied from somewhere but not qdel_swap()'d. WARNING: Not every time it's copied should be qdel_swap()'d. +/// But if you are doing anything DNA copy related, turn this on and make sure it's not infintely storing a datum somewhere. +GLOBAL_VAR(total_dna_counters) +GLOBAL_VAR(total_species_counters) + +/datum/dna/New() + . = ..() + GLOB.total_dna_counters += 1 + +/datum/dna/Destroy() + . = ..() + GLOB.total_dna_counters -= 1 + +/datum/species/New() + . = ..() + GLOB.total_species_counters += 1 + +/datum/species/Destroy() + . = ..() + GLOB.total_species_counters -= 1 + +/proc/delete_all_monkeys() + for(var/mob/living/carbon/human/monkey/monkeys in world) + qdel(monkeys) +*/