/datum/admins/var/datum/partmod_holder/part_modifier = null
var/list/default_organ_paths = list("head" = /obj/item/organ/head, "skull" = /obj/item/skull, "brain" = /obj/item/organ/brain, "left_eye" = /obj/item/organ/eye, "right_eye" = /obj/item/organ/eye, "chest" = /obj/item/organ/chest, "heart" = /obj/item/organ/heart, "left_lung" = /obj/item/organ/lung, "right_lung" = /obj/item/organ/lung, "butt" = /obj/item/clothing/head/butt, "liver" = /obj/item/organ/liver, "stomach" = /obj/item/organ/stomach, "intestines" = /obj/item/organ/intestines, "pancreas" = /obj/item/organ/pancreas, "spleen" = /obj/item/organ/spleen, "appendix" = /obj/item/organ/appendix, "left_kidney" = /obj/item/organ/kidney, "right_kidney" = /obj/item/organ/kidney)
var/list/default_limb_paths = list("l_arm" = /obj/item/parts/human_parts/arm/left, "r_arm" = /obj/item/parts/human_parts/arm/right, "l_leg" = /obj/item/parts/human_parts/leg/left, "r_leg" = /obj/item/parts/human_parts/leg/right)
/client/proc/modify_parts(var/mob/living/carbon/human/target as mob)
set category = "Special Verbs"
admin_only
if (!istype(target))
return
if (!target.limbs)
boutput(src, "Mob limb holder is broken.")
return
if (!target.organHolder)
boutput(src, "Mob organ holder is broken.")
return
if (!src.holder.part_modifier)
src.holder.part_modifier = new
src.holder.part_modifier.show_window(target, src)
/datum/partmod_holder
Topic(href, href_list)
..()
if (!href_list["action"] || !usr)
return
usr_admin_only
switch (href_list["action"])
// refresh
if ("refresh")
var/mob/living/carbon/human/H = locate(href_list["target"])
if (!H)
return
src.show_window(H, usr)
// view vars
if ("view_vars")
if (!usr.client || !(usr.client.holder && usr.client.holder.level >= LEVEL_PA))
boutput(usr, "Error: you must be a Primary Administrator or higher to view and edit vars.")
return
var/obj/O = locate(href_list["target"])
if (!O)
boutput(usr, "Error: invalid target.")
return
usr.client.debug_variables(O)
// sever limbs
if ("sever_limb")
var/datum/human_limbs/limbs = locate(href_list["target"])
var/target_limb = href_list["part"]
if (!limbs || !target_limb || !limbs.holder)
boutput(usr, "Error: invalid target limb(s).")
return
if (limbs.sever(target_limb, usr)) // returns 1 when at least one limb is severed
message_admins("[key_name(usr)] severed [key_name(limbs.holder)]'s limb(s): [uppertext(target_limb)]")
src.show_window(limbs.holder, usr)
// replace limbs
if ("replace_limb")
var/datum/human_limbs/limbs = locate(href_list["target"])
var/target_limb = href_list["part"]
if (!limbs || !target_limb || !limbs.holder)
boutput(usr, "Error: invalid target limb(s).")
return
var/new_type = get_one_match(input("Type path", "Type path", "[ispath(default_limb_paths[target_limb]) ? default_limb_paths[target_limb] : /obj/item/parts/human_parts]"), /obj)
if (!new_type)
return
if (!ispath(new_type, /obj/item))
if (!(usr.client && usr.client.holder && usr.client.holder.level >= LEVEL_PA))
boutput(usr, "You need to be at least a Primary Admin to give people limbs that aren't /obj/item things!")
return
if (alert(usr, "Giving someone an arm that isn't an /obj/item WILL cause runtimes! Runtimes are bad! Be sure you want to do this!", "WARNING", "OK", "Cancel") == "Cancel")
return
if (limbs.replace_with(target_limb, new_type, usr)) // returns 1 or greater when at least one limb is replaced
message_admins("[key_name(usr)] replaced [key_name(limbs.holder)]'s limb(s): [uppertext(target_limb)] (new type: [new_type])")
src.show_window(limbs.holder, usr)
// replace all limbs
if ("replace_all_limbs")
var/datum/human_limbs/limbs = locate(href_list["target"])
if (!limbs || !limbs.holder)
boutput(usr, "Error: invalid target.")
return
limbs.create()
logTheThing("admin", usr, limbs.holder, "replaced all of %target%'s missing limbs")
message_admins("[key_name(usr)] replaced all of [key_name(limbs.holder)]'s missing limbs")
limbs.holder.set_body_icon_dirty()
src.show_window(limbs.holder, usr)
// randomise limb
if ("randomise_limb")
var/datum/human_limbs/limbs = locate(href_list["target"])
var/target_limb = href_list["part"]
if(target_limb == "both_arms")
var/count = 0
if(limbs.replace_with("l_arm", pick(typesof(/obj/item/parts/human_parts/arm/left) - /obj/item/parts/human_parts/arm/left/item), usr)) count++
if(limbs.replace_with("r_arm", pick(typesof(/obj/item/parts/human_parts/arm/right) - /obj/item/parts/human_parts/arm/right/item), usr)) count++
if(count > 0)
message_admins("[key_name(usr)] randomised [count > 1 ? "both" : "one"] of [key_name(limbs.holder)]'s arms. New arms: [limbs.l_arm.type], [limbs.r_arm.type]")
else if(target_limb == "both_legs")
var/count = 0
if(limbs.replace_with("l_leg", pick(typesof(/obj/item/parts/human_parts/leg/left)), usr)) count++
if(limbs.replace_with("r_leg", pick(typesof(/obj/item/parts/human_parts/leg/right)), usr)) count++
if(count > 0)
message_admins("[key_name(usr)] randomised [count > 1 ? "both" : "one"] of [key_name(limbs.holder)]'s legs. New legs: [limbs.l_leg.type], [limbs.r_leg.type]")
else
if (!limbs || !target_limb || !limbs.holder || !ispath(default_limb_paths[target_limb]))
boutput(usr, "Error: invalid target limb(s).")
return
var/targetPath = default_limb_paths[target_limb]
var/new_type = pick(typesof(targetPath) - text2path("[targetPath]/item"))
if (!new_type)
return
if (limbs.replace_with(target_limb, new_type, usr)) // returns 1 or greater when at least one limb is replaced
message_admins("[key_name(usr)] randomised [key_name(limbs.holder)]'s limb: [uppertext(target_limb)] (new type: [new_type])")
src.show_window(limbs.holder, usr)
// randomise all limbs
if ("randomise_all_limbs")
var/datum/human_limbs/limbs = locate(href_list["target"])
if (!limbs || !limbs.holder)
boutput(usr, "Error: invalid target.")
return
var/count = 0
if(limbs.replace_with("l_arm", pick(typesof(/obj/item/parts/human_parts/arm/left) - /obj/item/parts/human_parts/arm/left/item), usr)) count++
if(limbs.replace_with("r_arm", pick(typesof(/obj/item/parts/human_parts/arm/right) - /obj/item/parts/human_parts/arm/right/item), usr)) count++
if(limbs.replace_with("l_leg", pick(typesof(/obj/item/parts/human_parts/leg/left)), usr)) count++
if(limbs.replace_with("r_leg", pick(typesof(/obj/item/parts/human_parts/leg/right)), usr)) count++
if(count > 0)
message_admins("[key_name(usr)] randomised [count] of [key_name(limbs.holder)]'s limbs. New limbs: [limbs.l_arm.type], [limbs.r_arm.type], [limbs.l_leg.type], [limbs.r_leg.type]")
// drop organs
if ("drop_organ")
var/datum/organHolder/organs = locate(href_list["target"])
var/target_organ = href_list["part"]
if (!organs || !target_organ || !organs.donor)
boutput(usr, "Error: invalid target organ(s).")
return
if (target_organ == "all" && alert(usr, "Are you sure you want to make [organs.donor] drop every single organ? This will kill them!", "Confirmation", "Yes", "No") == "No")
return
if (organs.drop_organ(target_organ, null)) // returns with the organ when at least one organ is dropped
logTheThing("admin", usr, organs.donor, "made %target% drop their organ(s): [uppertext(target_organ)]")
message_admins("[key_name(usr)] made [key_name(organs.donor)] drop their organ(s): [uppertext(target_organ)]")
src.show_window(organs.donor, usr)
// replace organs
if ("replace_organ")
var/datum/organHolder/organs = locate(href_list["target"])
var/target_organ = href_list["part"]
if (!organs || !target_organ || !organs.donor)
boutput(usr, "Error: invalid target organ(s).")
return
var/new_type = get_one_match(input("Type path", "Type path", "[ispath(default_organ_paths[target_organ]) ? default_organ_paths[target_organ] : /obj/item/organ]"), /obj)
if (!new_type)
return
if (!ispath(new_type, /obj/item))
if (!(usr.client && usr.client.holder && usr.client.holder.level >= LEVEL_PA))
boutput(usr, "You need to be at least a Primary Admin to give people organs that aren't /obj/item things!")
return
if (alert(usr, "Giving someone an organ that isn't an /obj/item WILL cause runtimes! Runtimes are bad! Be sure you want to do this!", "WARNING", "OK", "Cancel") == "Cancel")
return
var/obj/item/I = new new_type(organs.donor)
if (organs.receive_organ(I, target_organ, 0.0, 1)) // returns 1 if replace was successful
logTheThing("admin", usr, organs.donor, "replaced %target%'s [uppertext(target_organ)] with [new_type]")
message_admins("[key_name(usr)] replaced [key_name(organs.donor)]'s organ(s): [uppertext(target_organ)] (new type: [new_type])")
else
qdel(I) // ugly :/
src.show_window(organs.donor, usr)
// replace all organs
if ("replace_all_organs")
var/datum/organHolder/organs = locate(href_list["target"])
if (!organs || !organs.donor)
boutput(usr, "Error: invalid target.")
return
organs.create_organs()
logTheThing("admin", usr, organs.donor, "replaced all of %target%'s missing organs")
message_admins("[key_name(usr)] replaced all of [key_name(organs.donor)]'s missing organs")
organs.donor.set_body_icon_dirty()
src.show_window(organs.donor, usr)
proc/show_window(var/mob/living/carbon/human/target as mob, var/mob/user)
if (!istype(target) || !user)
return
if (!target.limbs)
if (alert(user, "[target]'s limb holder is broken, recreate?", "Error", "Yes", "No") == "Yes")
target.limbs = new(target)
else
return
if (!target.organHolder)
if (alert(user, "[target]'s organ holder is broken, recreate?", "Error", "Yes", "No") == "Yes")
target.organHolder = new(target)
else
return
var/datum/human_limbs/limbs = target.limbs
var/datum/organHolder/organs = target.organHolder
var/see_vars = 0
if (ismob(user) && user.client && user.client.holder && user.client.holder.level >= LEVEL_PA)
see_vars = 1
else if (isclient(user))
var/client/C = user
if (C.holder && C.holder.level >= LEVEL_PA)
see_vars = 1
else if (usr && usr.client && usr.client.holder && usr.client.holder.level >= LEVEL_PA) // ONE OF YOU HAS TO EXIST
see_vars = 1
var/HTML = {"
Part Modifier: [see_vars ? "[target]" : "[target]"]
Refresh
| Limb |
Name |
Type |
Sever |
New |
Random |
[see_vars ? "Vars | " : null]
| Left Arm |
[limbs.l_arm ? limbs.l_arm : "None"] |
[limbs.l_arm ? limbs.l_arm.type : "None"] |
\[X\] |
\[X\] |
\[X\] |
[(see_vars) ? "[limbs.l_arm ? "\[X\] | " : "None | "]" : null]
| Right Arm |
[limbs.r_arm ? limbs.r_arm : "None"] |
[limbs.r_arm ? limbs.r_arm.type : "None"] |
\[X\] |
\[X\] |
\[X\] |
[(see_vars) ? "[limbs.r_arm ? "\[X\] | " : "None | "]" : null]
| Left Leg |
[limbs.l_leg ? limbs.l_leg : "None"] |
[limbs.l_leg ? limbs.l_leg.type : "None"] |
\[X\] |
\[X\] |
\[X\] |
[(see_vars) ? "[limbs.l_leg ? "\[X\] | " : "None | "]" : null]
| Right Leg |
[limbs.r_leg ? limbs.r_leg : "None"] |
[limbs.r_leg ? limbs.r_leg.type : "None"] |
\[X\] |
\[X\] |
\[X\] |
[(see_vars) ? "[limbs.r_leg ? "\[X\] | " : "None | "]" : null]
| Both Arms |
N/A |
N/A |
\[X\] |
\[X\] |
\[X\] |
[see_vars ? "N/A | " : null]
| Both Legs |
N/A |
N/A |
\[X\] |
\[X\] |
\[X\] |
[see_vars ? "N/A | " : null]
| All Limbs |
N/A |
N/A |
\[X\] |
\[X\] |
\[X\] |
[see_vars ? "\[X\] | " : null]
| Organ |
Name |
Type |
Drop |
New |
[see_vars ? "Vars | " : null]
| Head |
[organs.head ? organs.head : "None"] |
[organs.head ? organs.head.type : "None"] |
\[X\] |
\[X\] |
[(see_vars) ? "[organs.skull ? "\[X\] | " : "None | "]" : null]
| Skull |
[organs.skull ? organs.skull : "None"] |
[organs.skull ? organs.skull.type : "None"] |
\[X\] |
\[X\] |
[(see_vars) ? "[organs.skull ? "\[X\] | " : "None | "]" : null]
| Brain |
[organs.brain ? organs.brain : "None"] |
[organs.brain ? organs.brain.type : "None"] |
\[X\] |
\[X\] |
[(see_vars) ? "[organs.brain ? "\[X\] | " : "None | "]" : null]
| Left Eye |
[organs.left_eye ? organs.left_eye : "None"] |
[organs.left_eye ? organs.left_eye.type : "None"] |
\[X\] |
\[X\] |
[(see_vars) ? "[organs.left_eye ? "\[X\] | " : "None | "]" : null]
| Right Eye |
[organs.right_eye ? organs.right_eye : "None"] |
[organs.right_eye ? organs.right_eye.type : "None"] |
\[X\] |
\[X\] |
[(see_vars) ? "[organs.right_eye ? "\[X\] | " : "None | "]" : null]
| Chest |
[organs.chest ? organs.chest : "None"] |
[organs.chest ? organs.chest.type : "None"] |
\[X\] |
\[X\] |
[(see_vars) ? "[organs.chest ? "\[X\] | " : "None | "]" : null]
| Heart |
[organs.heart ? organs.heart : "None"] |
[organs.heart ? organs.heart.type : "None"] |
\[X\] |
\[X\] |
[(see_vars) ? "[organs.heart ? "\[X\] | " : "None | "]" : null]
| Left Lung |
[organs.left_lung ? organs.left_lung : "None"] |
[organs.left_lung ? organs.left_lung.type : "None"] |
\[X\] |
\[X\] |
[(see_vars) ? "[organs.left_lung ? "\[X\] | " : "None | "]" : null]
| Right Lung |
[organs.right_lung ? organs.right_lung : "None"] |
[organs.right_lung ? organs.right_lung.type : "None"] |
\[X\] |
\[X\] |
[(see_vars) ? "[organs.right_lung ? "\[X\] | " : "None | "]" : null]
| Butt |
[organs.butt ? organs.butt : "None"] |
[organs.butt ? organs.butt.type : "None"] |
\[X\] |
\[X\] |
[(see_vars) ? "[organs.butt ? "\[X\] | " : "None | "]" : null]
---------------------------------
| Left Kidney |
[organs.left_kidney ? organs.left_kidney : "None"] |
[organs.left_kidney ? organs.left_kidney.type : "None"] |
\[X\] |
\[X\] |
[(see_vars) ? "[organs.left_kidney ? "\[X\] | " : "None | "]" : null]
| Right Kidney |
[organs.right_kidney ? organs.right_kidney : "None"] |
[organs.right_kidney ? organs.right_kidney.type : "None"] |
\[X\] |
\[X\] |
[(see_vars) ? "[organs.right_kidney ? "\[X\] | " : "None | "]" : null]
| Liver |
[organs.liver ? organs.liver : "None"] |
[organs.liver ? organs.liver.type : "None"] |
\[X\] |
\[X\] |
[(see_vars) ? "[organs.liver ? "\[X\] | " : "None | "]" : null]
| Stomach |
[organs.stomach ? organs.stomach : "None"] |
[organs.stomach ? organs.stomach.type : "None"] |
\[X\] |
\[X\] |
[(see_vars) ? "[organs.stomach ? "\[X\] | " : "None | "]" : null]
| Intestines |
[organs.intestines ? organs.intestines : "None"] |
[organs.intestines ? organs.intestines.type : "None"] |
\[X\] |
\[X\] |
[(see_vars) ? "[organs.intestines ? "\[X\] | " : "None | "]" : null]
| Spleen |
[organs.spleen ? organs.spleen : "None"] |
[organs.spleen ? organs.spleen.type : "None"] |
\[X\] |
\[X\] |
[(see_vars) ? "[organs.spleen ? "\[X\] | " : "None | "]" : null]
| Pancreas |
[organs.pancreas ? organs.pancreas : "None"] |
[organs.pancreas ? organs.pancreas.type : "None"] |
\[X\] |
\[X\] |
[(see_vars) ? "[organs.pancreas ? "\[X\] | " : "None | "]" : null]
| Appendix |
[organs.appendix ? organs.appendix : "None"] |
[organs.appendix ? organs.appendix.type : "None"] |
\[X\] |
\[X\] |
[(see_vars) ? "[organs.appendix ? "\[X\] | " : "None | "]" : null]
------------------------------------
| All Organs |
N/A |
N/A |
\[X\] |
\[X\] |
[see_vars ? "\[X\] | " : null]
"}
user.Browse(HTML,"window=part_mod_[target.ckey ? target.ckey : target];size=680x680")