diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 4777f061d6..1e6d9790eb 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -259,6 +259,8 @@ client body += "" body += "" body += "" + body += "" + body += "" body += "" @@ -875,6 +877,74 @@ client else H.verbs -= verb + else if(href_list["addorgan"]) + if(!check_rights(R_SPAWN)) return + + var/mob/living/carbon/M = locate(href_list["addorgan"]) + if(!istype(M)) + usr << "This can only be done to instances of type /mob/living/carbon" + return + + var/new_organ = input("Please choose an organ to add.","Organ",null) as null|anything in typesof(/datum/organ/internal)-/datum/organ/internal + + if(!M) + usr << "Mob doesn't exist anymore" + return + + if(locate(new_organ) in M.internal_organs) + usr << "Mob already has that organ." + return + + if(istype(M,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + var/datum/organ/internal/I = new new_organ(H) + + var/organ_slot = input(usr, "Which slot do you want the organ to go in ('default' for default)?") as text|null + + if(!organ_slot) + return + + if(organ_slot != "default") + organ_slot = sanitize(copytext(organ_slot,1,MAX_MESSAGE_LEN)) + else + if(I.removed_type) + var/obj/item/organ/O = new I.removed_type() + organ_slot = O.organ_tag + del(O) + else + organ_slot = "unknown organ" + + if(H.internal_organs_by_name[organ_slot]) + usr << "[H] already has an organ in that slot." + del(I) + return + + H.internal_organs_by_name[organ_slot] = I + usr << "Added new [new_organ] to [H] as slot [organ_slot]." + else + new new_organ(M) + usr << "Added new [new_organ] to [M]." + + else if(href_list["remorgan"]) + if(!check_rights(R_SPAWN)) return + + var/mob/living/carbon/M = locate(href_list["remorgan"]) + if(!istype(M)) + usr << "This can only be done to instances of type /mob/living/carbon" + return + + var/rem_organ = input("Please choose an organ to remove.","Organ",null) as null|anything in M.internal_organs + + if(!M) + usr << "Mob doesn't exist anymore" + return + + if(!(locate(rem_organ) in M.internal_organs)) + usr << "Mob does not have that organ." + return + + usr << "Removed [rem_organ] from [M]." + del(rem_organ) else if(href_list["fix_nano"]) if(!check_rights(R_DEBUG)) return @@ -885,8 +955,6 @@ client usr << "This can only be done on mobs with clients" return - - nanomanager.send_resources(H.client) usr << "Resource files sent" @@ -894,8 +962,6 @@ client log_admin("[key_name(usr)] resent the NanoUI resource files to [key_name(H)] ") - - else if(href_list["regenerateicons"]) if(!check_rights(0)) return diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index 3a84eb3a11..c2df9a30f0 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -25,15 +25,19 @@ /datum/organ/internal/proc/is_broken() return damage >= min_broken_damage || status & ORGAN_CUT_AWAY -/datum/organ/internal/New(mob/living/carbon/human/H) +/datum/organ/internal/New(mob/living/carbon/M) ..() - if(H) - var/datum/organ/external/E = H.organs_by_name[src.parent_organ] - if(E.internal_organs == null) - E.internal_organs = list() - E.internal_organs |= src - H.internal_organs |= src - src.owner = H + if(M && istype(M)) + + M.internal_organs |= src + src.owner = M + + var/mob/living/carbon/human/H = M + if(istype(H)) + var/datum/organ/external/E = H.organs_by_name[src.parent_organ] + if(E.internal_organs == null) + E.internal_organs = list() + E.internal_organs |= src /datum/organ/internal/process()