diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index c4cee037c58..c0181912414 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1323,3 +1323,11 @@ var/list/WALLITEMS = list( "lime","darkgreen","cyan","navy","teal","purple","indigo") else return "white" + +/proc/IsValidSrc(var/A) + if(istype(A, /datum)) + var/datum/B = A + return !B.gc_destroyed + if(istype(A, /client)) + return 1 + return 0 diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index c4e3856e295..cca3970fb00 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -237,6 +237,7 @@ body += "" + body += "" if(ismob(D)) body += "" @@ -443,6 +444,14 @@ body src.holder.marked_datum = D href_list["datumrefresh"] = href_list["mark_object"] + else if(href_list["proc_call"]) + if(!check_rights(0)) return + + var/T = locate(href_list["proc_call"]) + + if(T) + callproc_datum(T) + else if(href_list["regenerateicons"]) if(!check_rights(0)) return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index c48b54bc764..0ce5eef9209 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -463,13 +463,18 @@ var/list/admin_verbs_hideable = list( set category = "Fun" set name = "Give Spell" set desc = "Gives a spell to a mob." - var/obj/effect/proc_holder/spell/S = input("Choose the spell to give to that guy", "ABRAKADABRA") as null|anything in spells + + var/list/spell_list = list() + var/type_length = length("/obj/effect/proc_holder/spell") + 2 + for(var/A in spells) + spell_list[copytext("[A]", type_length)] = A + var/obj/effect/proc_holder/spell/S = input("Choose the spell to give to that guy", "ABRAKADABRA") as null|anything in spell_list if(!S) return + S = spell_list[S] feedback_add_details("admin_verb","GS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] gave [key_name(T)] the spell [S].") message_admins("[key_name_admin(usr)] gave [key_name(T)] the spell [S].") - if(T.mind) T.mind.AddSpell(new S) else diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 02aac7f6db8..9dc2e9482ba 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -83,16 +83,13 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that usr << "[procname] returned: [returnval ? returnval : "null"]" feedback_add_details("admin_verb","APC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/callproc_datum(var/atom/A as null|area|mob|obj|turf) +/client/proc/callproc_datum(var/A as null|area|mob|obj|turf) set category = "Debug" set name = "Atom ProcCall" if(!check_rights(R_DEBUG)) return - if(!istype(A)) - return - var/procname = input("Proc name, eg: fake_blood","Proc:", null) as text|null if(!procname) return @@ -101,7 +98,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that if(!lst) return - if(!A || A.gc_destroyed) + if(!A || !IsValidSrc(A)) usr << "Error: callproc_datum(): owner of proc no longer exists." return if(!hascall(A,procname))