diff --git a/code/datums/elements/blood_reagent.dm b/code/datums/elements/blood_reagent.dm index 74c2dff9ba8..9373eaf5e4d 100644 --- a/code/datums/elements/blood_reagent.dm +++ b/code/datums/elements/blood_reagent.dm @@ -31,9 +31,13 @@ target.description = blood_type.desc target.color = blood_type.get_color() + if (!blood_source) + target.material = GET_MATERIAL_REF(/datum/material/meat/blood_meat, target) return + target.material = GET_MATERIAL_REF(/datum/material/meat/mob_meat, blood_source) + var/list/blood_data = blood_source.get_blood_data() if(blood_data["viruses"]) var/list/to_preserve = list() diff --git a/code/datums/materials/hauntium.dm b/code/datums/materials/hauntium.dm index 0f9fd2f3e48..1fc0de30c84 100644 --- a/code/datums/materials/hauntium.dm +++ b/code/datums/materials/hauntium.dm @@ -27,12 +27,30 @@ /datum/material/hauntium/on_main_applied(atom/source, mat_amount, multiplier) . = ..() - if(isobj(source)) - var/obj/obj = source - obj.make_haunted(INNATE_TRAIT, "#f8f8ff") + if(!isobj(source)) + return + var/obj/obj = source + obj.make_haunted(INNATE_TRAIT, "#f8f8ff") + if(isbodypart(source)) + var/obj/item/bodypart/bodypart = source + if(!(bodypart::bodytype & BODYTYPE_GHOST)) + bodypart.bodytype |= BODYTYPE_GHOST + if(isorgan(source)) + var/obj/item/organ/organ = source + if(!(organ::organ_flags & ORGAN_GHOST)) + organ.organ_flags |= ORGAN_GHOST /datum/material/hauntium/on_main_removed(atom/source, mat_amount, multiplier) . = ..() - if(isobj(source)) - var/obj/obj = source - obj.remove_haunted(INNATE_TRAIT) + if(!isobj(source)) + return + var/obj/obj = source + obj.remove_haunted(INNATE_TRAIT) + if(isbodypart(source)) + var/obj/item/bodypart/bodypart = source + if(!(bodypart::bodytype & BODYTYPE_GHOST)) + bodypart.bodytype &= ~BODYTYPE_GHOST + if(isorgan(source)) + var/obj/item/organ/organ = source + if(!(organ::organ_flags & ORGAN_GHOST)) + organ.organ_flags &= ~ORGAN_GHOST diff --git a/code/datums/materials/meat.dm b/code/datums/materials/meat.dm index b5c2f5e4bef..1937d6c0224 100644 --- a/code/datums/materials/meat.dm +++ b/code/datums/materials/meat.dm @@ -25,11 +25,20 @@ fishing_deceleration_mult = 0.9 fishing_bounciness_mult = 0.9 fishing_gravity_mult = 0.85 + var/list/blood_dna /datum/material/meat/on_main_applied(atom/source, mat_amount, multiplier) . = ..() make_edible(source, mat_amount, multiplier) ADD_TRAIT(source, TRAIT_ROD_REMOVE_FISHING_DUD, REF(src)) //The rod itself is the bait... sorta. + if(isbodypart(source)) + var/obj/item/bodypart/bodypart = source + if(!(bodypart::bodytype & BODYTYPE_ORGANIC)) + bodypart.bodytype |= BODYTYPE_ORGANIC + if(isorgan(source)) + var/obj/item/organ/organ = source + if(!(organ::organ_flags & ORGAN_ORGANIC)) + organ.organ_flags |= ORGAN_ORGANIC /datum/material/meat/on_applied(atom/source, mat_amount, multiplier) . = ..() @@ -74,6 +83,7 @@ source.AddComponent( /datum/component/bloody_spreader,\ blood_left = (protein_count + fat_count) * 0.3 * multiplier,\ + blood_dna = blood_dna,\ ) // Turfs can't handle the meaty goodness of blood walk. @@ -85,6 +95,7 @@ blood_type = /obj/effect/decal/cleanable/blood,\ blood_spawn_chance = 35,\ max_blood = (protein_count + fat_count) * 0.3 * multiplier,\ + blood_dna_info = blood_dna,\ ) /datum/material/meat/on_removed(atom/source, mat_amount, multiplier) @@ -97,6 +108,14 @@ /datum/material/meat/on_main_removed(atom/source, mat_amount, multiplier) . = ..() REMOVE_TRAIT(source, TRAIT_ROD_REMOVE_FISHING_DUD, REF(src)) + if(isbodypart(source)) + var/obj/item/bodypart/bodypart = source + if(!(bodypart::bodytype & BODYTYPE_ORGANIC)) + bodypart.bodytype &= ~BODYTYPE_ORGANIC + if(isorgan(source)) + var/obj/item/organ/organ = source + if(!(organ::organ_flags & ORGAN_ORGANIC)) + organ.organ_flags &= ~ORGAN_ORGANIC /datum/material/meat/mob_meat init_flags = MATERIAL_INIT_BESPOKE @@ -114,6 +133,11 @@ else if(source.name) subjectname = source.name + var/datum/blood_type/blood_type = source.get_bloodtype() + color = blood_type.get_color() + + blood_dna = source.get_blood_dna_list() + if(ishuman(source)) var/mob/living/carbon/human/human_source = source subjectjob = human_source.job @@ -128,4 +152,28 @@ return FALSE name = "[source?.name || "mystery"] [initial(name)]" + + if(source.exotic_bloodtype) + var/datum/blood_type/blood_type = get_blood_type(source.exotic_bloodtype) + color = blood_type.get_color() + blood_dna = list("[blood_type.dna_string]" = blood_type) + + return ..() + +/datum/material/meat/blood_meat + init_flags = MATERIAL_INIT_BESPOKE + +/datum/material/meat/blood_meat/Initialize(_id, datum/reagent/source) + if(!istype(source)) + return FALSE + + var/list/blood_data = source.data + name = "[blood_data["real_name"] || "mystery"] [initial(name)]" + var/datum/blood_type/blood_type = blood_data["blood_type"] + if(blood_type) + color = blood_type.get_color() + blood_dna = list("[blood_type.dna_string]" = blood_type) + else + color = source.color + return ..() diff --git a/code/modules/reagents/chemistry/holder/holder.dm b/code/modules/reagents/chemistry/holder/holder.dm index f3661b72f88..526f4e43c4c 100644 --- a/code/modules/reagents/chemistry/holder/holder.dm +++ b/code/modules/reagents/chemistry/holder/holder.dm @@ -170,9 +170,8 @@ new_reagent.purity = added_purity new_reagent.creation_purity = added_purity new_reagent.ph = added_ph - if (creation_callback) - creation_callback.Invoke(new_reagent) new_reagent.on_new(data) + creation_callback?.Invoke(new_reagent) if(isliving(my_atom)) new_reagent.on_mob_add(my_atom, amount) //Must occur before it could posibly run on_mob_delete