diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index fa4f88083f..9d40b49bcf 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -125,7 +125,7 @@
if(target in admins)
admin_stuff += "/([key])"
if(target != src)
- admin_stuff += "(JMP)"
+ admin_stuff += "([admin_jump_link(mob, target.holder)])"
if(target.mob in heard)
send = 1
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 5e486c195a..bdf9e43bb9 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -58,7 +58,7 @@ proc/admin_notice(var/message, var/rights)
TP -
PM -
SM -
- JMP\]
+ [admin_jump_link(M, src)]\]
Mob type = [M.type]
Kick |
Warn |
@@ -1306,15 +1306,15 @@ proc/admin_notice(var/message, var/rights)
if(2) //Admins
var/ref_mob = "\ref[M]"
- return "[key_name(C, link, name, highlight_special)](?) (PP) (VV) (SM) (JMP) (CA)"
+ return "[key_name(C, link, name, highlight_special)](?) (PP) (VV) (SM) ([admin_jump_link(M, src)]) (CA)"
if(3) //Devs
var/ref_mob = "\ref[M]"
- return "[key_name(C, link, name, highlight_special)](VV)(JMP)"
+ return "[key_name(C, link, name, highlight_special)](VV)([admin_jump_link(ref_mob, src)])"
if(4) //Mentors
var/ref_mob = "\ref[M]"
- return "[key_name(C, link, name, highlight_special)] (?) (PP) (VV) (SM) (JMP)"
+ return "[key_name(C, link, name, highlight_special)] (?) (PP) (VV) (SM) ([admin_jump_link(ref_mob, src)])"
/proc/ishost(whom)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index e780c9fd5d..65d466164b 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1247,7 +1247,7 @@
src.owner << "Name = [M.name]; Real_name = [M.real_name]; Mind_name = [M.mind?"[M.mind.name]":""]; Key = [M.key];"
src.owner << "Location = [location_description];"
src.owner << "[special_role_description]"
- src.owner << "(PM) (PP) (VV) (SM) (JMP) (CA)"
+ src.owner << "(PM) (PP) (VV) (SM) ([admin_jump_link(M, src)]) (CA)"
else if(href_list["adminspawncookie"])
if(!check_rights(R_ADMIN|R_FUN)) return
@@ -2659,4 +2659,26 @@ mob/living/carbon/human/can_centcom_reply()
return istype(l_ear, /obj/item/device/radio/headset) || istype(r_ear, /obj/item/device/radio/headset)
mob/living/silicon/ai/can_centcom_reply()
- return common_radio != null && !check_unable(2)
\ No newline at end of file
+ return common_radio != null && !check_unable(2)
+
+/atom/proc/extra_admin_link()
+ return
+
+/mob/extra_admin_link(var/source)
+ if(client && eyeobj)
+ return "|EYE"
+
+/mob/dead/observer/extra_admin_link(var/source)
+ if(mind && mind.current)
+ return "|BDY"
+
+/proc/admin_jump_link(var/atom/target, var/source)
+ if(!target) return
+ // The way admin jump links handle their src is weirdly inconsistent...
+ if(istype(source, /datum/admins))
+ source = "src=\ref[source]"
+ else
+ source = "_src_=holder"
+
+ . = "JMP"
+ . += target.extra_admin_link(source)
diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm
index fdbbe8d4e1..84764b55aa 100644
--- a/code/modules/admin/verbs/adminsay.dm
+++ b/code/modules/admin/verbs/adminsay.dm
@@ -12,7 +12,7 @@
if(check_rights(R_ADMIN,0))
for(var/client/C in admins)
if(R_ADMIN & C.holder.rights)
- C << "" + create_text_tag("admin", "ADMIN:", C) + " [key_name(usr, 1)](JMP): [msg]"
+ C << "" + create_text_tag("admin", "ADMIN:", C) + " [key_name(usr, 1)]([admin_jump_link(mob, src)]): [msg]"
feedback_add_details("admin_verb","M") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -33,6 +33,6 @@
if(check_rights(R_ADMIN, 0))
sender_name = "[sender_name]"
for(var/client/C in admins)
- C << "" + create_text_tag("mod", "MOD:", C) + " [sender_name](JMP): [msg]"
+ C << "" + create_text_tag("mod", "MOD:", C) + " [sender_name]([admin_jump_link(mob, C.holder)]): [msg]"
feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index d987c52260..dc4b79c005 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -17,7 +17,7 @@
return
var/image/cross = image('icons/obj/storage.dmi',"bible")
- msg = "\blue \icon[cross] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) (JMP) (CA) (SC): [msg]"
+ msg = "\blue \icon[cross] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src, src)]) (CA) (SC): [msg]"
for(var/client/C in admins)
if(R_ADMIN & C.holder.rights)
@@ -29,13 +29,13 @@
//log_admin("HELP: [key_name(src)]: [msg]")
/proc/Centcomm_announce(var/msg, var/mob/Sender, var/iamessage)
- msg = "\blue CENTCOMM[iamessage ? " IA" : ""]:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]"
+ msg = "\blue CENTCOMM[iamessage ? " IA" : ""]:[key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, src)]) (CA) (BSA) (RPLY): [msg]"
for(var/client/C in admins)
if(R_ADMIN & C.holder.rights)
C << msg
/proc/Syndicate_announce(var/msg, var/mob/Sender)
- msg = "\blue ILLEGAL:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]"
+ msg = "\blue ILLEGAL:[key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, src)]) (CA) (BSA) (RPLY): [msg]"
for(var/client/C in admins)
if(R_ADMIN & C.holder.rights)
C << msg
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 37aecab043..85b71aef4f 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -686,7 +686,7 @@ mob/dead/observer/MayRespawn(var/feedback = 0)
return
/mob/extra_ghost_link(var/atom/ghost)
- if(mind && eyeobj)
+ if(client && eyeobj)
return "|eye"
/mob/dead/observer/extra_ghost_link(var/atom/ghost)
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 563c7c5551..324c99b0b1 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -557,7 +557,7 @@ proc/is_blind(A)
if(subject != M)
follow = "([ghost_follow_link(subject, M)]) "
if(M.stat != DEAD && M.client.holder)
- follow = "(JMP) "
+ follow = "([admin_jump_link(subject, M.client.holder)]) "
var/mob/dead/observer/DM
if(istype(subject, /mob/dead/observer))
DM = subject
diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm
index 7cd104870f..44d42e1b9d 100644
--- a/code/modules/paperwork/faxmachine.dm
+++ b/code/modules/paperwork/faxmachine.dm
@@ -211,7 +211,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
/obj/machinery/photocopier/faxmachine/proc/message_admins(var/mob/sender, var/faxname, var/obj/item/sent, var/reply_type, font_colour="#006100")
- var/msg = "\blue [faxname]: [key_name(sender, 1)] (PP) (VV) (SM) (JMP) (CA) (REPLY): Receiving '[sent.name]' via secure connection ... view message"
+ var/msg = "\blue [faxname]: [key_name(sender, 1)] (PP) (VV) (SM) ([admin_jump_link(sender, src)]) (CA) (REPLY): Receiving '[sent.name]' via secure connection ... view message"
for(var/client/C in admins)
if(R_ADMIN & C.holder.rights)