diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 353e0f46ead..7710d2cfec0 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -478,36 +478,46 @@ Turf and target are seperate in case you want to teleport some distance from a t
var/mob/M
var/client/C
var/key
+ var/ckey
if(!whom) return "*null*"
if(istype(whom, /client))
C = whom
M = C.mob
key = C.key
+ ckey = C.ckey
else if(ismob(whom))
M = whom
C = M.client
key = M.key
- else if(istype(whom, /datum))
- var/datum/D = whom
- return "*invalid:[D.type]*"
+ ckey = M.ckey
+ else if(istext(whom))
+ key = whom
+ ckey = ckey(whom)
+ C = directory[ckey]
+ if(C)
+ M = C.mob
else
return "*invalid*"
. = ""
+ if(!ckey)
+ include_link = 0
+
if(key)
- if(include_link && C)
- . += ""
-
+ if(include_link)
+ . += ""
+
if(C && C.holder && C.holder.fakekey && !include_name)
. += "Administrator"
else
. += key
+ if(!C)
+ . += "\[DC\]"
if(include_link)
- if(C) . += ""
- else . += " (DC)"
+ . += ""
else
. += "*no key*"
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 1055324f57d..d0fdbe4b182 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -17,62 +17,60 @@ var/global/floorIsLava = 0
set name = "Show Player Panel"
set desc="Edit player (respawn, ban, heal, etc)"
+ if(!check_rights())
+ return
+
if(!M)
usr << "You seem to be selecting a mob that doesn't exist anymore."
return
- if (!istype(src,/datum/admins))
- src = usr.client.holder
- if (!istype(src,/datum/admins))
- usr << "Error: you are not an admin!"
- return
var/body = "
Options for [M.key]"
body += "Options panel for [M]"
if(M.client)
body += " played by [M.client] "
- body += "\[[M.client.holder ? M.client.holder.rank : "Player"]\]"
+ body += "\[[M.client.holder ? M.client.holder.rank : "Player"]\]"
if(istype(M, /mob/new_player))
body += " Hasn't Entered Game "
else
- body += " \[Heal\] "
+ body += " \[Heal\] "
body += "
\[ "
body += "VV - "
- body += "TP - "
- body += "PM - "
- body += "SM - "
- body += "JMP\]
"
+ body += "TP - "
+ body += "PM - "
+ body += "SM - "
+ body += "JMP\]
"
body += "Mob type = [M.type]
"
- body += "Kick | "
+ body += "Kick | "
body += "Warn | "
- body += "Ban | "
- body += "Jobban | "
- body += "Appearance Ban | "
- body += "Notes "
+ body += "Ban | "
+ body += "Jobban | "
+ body += "Appearance Ban | "
+ body += "Notes "
if(M.client)
- body += "| Prison | "
+ body += "| Prison | "
var/muted = M.client.prefs.muted
body += "
Mute: "
- body += "\[IC | "
- body += "OOC | "
- body += "PRAY | "
- body += "ADMINHELP | "
- body += "DEADCHAT\]"
- body += "(toggle all)"
+ body += "\[IC | "
+ body += "OOC | "
+ body += "PRAY | "
+ body += "ADMINHELP | "
+ body += "DEADCHAT\]"
+ body += "(toggle all)"
body += "
"
- body += "Jump to | "
- body += "Get | "
- body += "Send To"
+ body += "Jump to | "
+ body += "Get | "
+ body += "Send To"
body += "
"
- body += "Traitor panel | "
- body += "Narrate to | "
- body += "Subtle message"
+ body += "Traitor panel | "
+ body += "Narrate to | "
+ body += "Subtle message"
if (M.client)
if(!istype(M, /mob/new_player))
@@ -84,66 +82,66 @@ var/global/floorIsLava = 0
if(ismonkey(M))
body += "Monkeyized | "
else
- body += "Monkeyize | "
+ body += "Monkeyize | "
//Corgi
if(iscorgi(M))
body += "Corgized | "
else
- body += "Corgize | "
+ body += "Corgize | "
//AI / Cyborg
if(isAI(M))
body += "Is an AI "
else if(ishuman(M))
- body += "Make AI | "
- body += "Make Robot | "
- body += "Make Alien | "
- body += "Make Blob Fragment | "
- body += "Make Slime "
+ body += "Make AI | "
+ body += "Make Robot | "
+ body += "Make Alien | "
+ body += "Make Blob Fragment | "
+ body += "Make Slime "
//Simple Animals
if(isanimal(M))
- body += "Re-Animalize | "
+ body += "Re-Animalize | "
else
- body += "Animalize | "
+ body += "Animalize | "
body += "
"
body += "Rudimentary transformation:
These transformations only create a new mob type and copy stuff over. They do not take into account MMIs and similar mob-specific things. The buttons in 'Transformations' are preferred, when possible.
"
- body += "Observer | "
- body += "\[ Alien: Drone, "
- body += "Hunter, "
- body += "Queen, "
- body += "Sentinel, "
- body += "Larva \] "
- body += "Human "
- body += "\[ slime: Baby, "
- body += "Adult \] "
- body += "Monkey | "
- body += "Cyborg | "
- body += "Cat | "
- body += "Runtime | "
- body += "Corgi | "
- body += "Ian | "
- body += "Crab | "
- body += "Coffee | "
- //body += "Parrot | "
- //body += "Poly | "
- body += "\[ Construct: Armoured , "
- body += "Builder , "
- body += "Wraith \] "
- body += "Shade"
+ body += "Observer | "
+ body += "\[ Alien: Drone, "
+ body += "Hunter, "
+ body += "Queen, "
+ body += "Sentinel, "
+ body += "Larva \] "
+ body += "Human "
+ body += "\[ slime: Baby, "
+ body += "Adult \] "
+ body += "Monkey | "
+ body += "Cyborg | "
+ body += "Cat | "
+ body += "Runtime | "
+ body += "Corgi | "
+ body += "Ian | "
+ body += "Crab | "
+ body += "Coffee | "
+ //body += "Parrot | "
+ //body += "Poly | "
+ body += "\[ Construct: Armoured , "
+ body += "Builder , "
+ body += "Wraith \] "
+ body += "Shade"
body += "
"
if (M.client)
body += "
"
body += "Other actions:"
body += "
"
- body += "Forcesay | "
- body += "Thunderdome 1 | "
- body += "Thunderdome 2 | "
- body += "Thunderdome Admin | "
- body += "Thunderdome Observer | "
+ body += "Forcesay | "
+ body += "Thunderdome 1 | "
+ body += "Thunderdome 2 | "
+ body += "Thunderdome Admin | "
+ body += "Thunderdome Observer | "
body += "
"
body += ""
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index cc389291a3c..1fbd7a6dc39 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -1,5 +1,5 @@
/datum/admins/proc/player_panel_new()//The new one
- if (!usr.client.holder)
+ if(!check_rights())
return
var/dat = "Player Panel"
@@ -65,6 +65,7 @@
clearAll();
var span = document.getElementById(id);
+ var ckey = key.toLowerCase().replace(/\[^a-z@0-9\]+/g,"");
body = "| ";
@@ -74,15 +75,15 @@
body += " | ";
- body += "PP - "
- body += "N - "
+ body += "PP - "
+ body += "N - "
body += "VV - "
- body += "TP - "
- body += "PM - "
- body += "SM - "
- body += "JMP "
+ body += "TP - "
+ body += "PM - "
+ body += "SM - "
+ body += "JMP "
if(antagonist > 0)
- body += "Antagonist";
+ body += "Antagonist";
body += " |
";
@@ -193,7 +194,7 @@
Player panel
- Hover over a line to see more information - Check antagonists
+ Hover over a line to see more information - Check antagonists
|
@@ -319,7 +320,7 @@
//The old one
/datum/admins/proc/player_panel_old()
- if (!usr.client.holder)
+ if(!check_rights())
return
var/dat = "Player Menu"
dat += "| Name | Real Name | Assigned Job | Key | Options | PM | Traitor? |
"
@@ -360,16 +361,16 @@
dat += {"[(M.client ? "[M.client]" : "No client")] |
- X |
- PM |
+ X |
+ PM |
"}
switch(is_special_character(M))
if(0)
- dat += {"Traitor? | "}
+ dat += {"Traitor? | "}
if(1)
- dat += {"Traitor? | "}
+ dat += {"Traitor? | "}
if(2)
- dat += {"Traitor? | "}
+ dat += {"Traitor? | "}
dat += "
"
@@ -384,23 +385,23 @@
dat += "Round Duration: [round(world.time / 36000)]:[add_zero(world.time / 600 % 60, 2)]:[world.time / 100 % 6][world.time / 100 % 10]
"
dat += "Emergency shuttle
"
if (!emergency_shuttle.online)
- dat += "Call Shuttle
"
+ dat += "Call Shuttle
"
else
var/timeleft = emergency_shuttle.timeleft()
switch(emergency_shuttle.location)
if(0)
- dat += "ETA: [(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]
"
- dat += "Send Back
"
+ dat += "ETA: [(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]
"
+ dat += "Send Back
"
if(1)
- dat += "ETA: [(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]
"
- dat += "[ticker.delay_end ? "End Round Normally" : "Delay Round End"]
"
+ dat += "ETA: [(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]
"
+ dat += "[ticker.delay_end ? "End Round Normally" : "Delay Round End"]
"
if(ticker.mode.syndicates.len)
dat += "
| Syndicates | |
"
for(var/datum/mind/N in ticker.mode.syndicates)
var/mob/M = N.current
if(M)
- dat += "| [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""] | "
- dat += "PM |
"
+ dat += "| [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "PM |
"
else
dat += "| Nuclear Operative not found! |
"
dat += "
| Nuclear Disk(s) |
"
@@ -410,7 +411,7 @@
while(!istype(disk_loc, /turf))
if(istype(disk_loc, /mob))
var/mob/M = disk_loc
- dat += "carried by [M.real_name] "
+ dat += "carried by [M.real_name] "
if(istype(disk_loc, /obj))
var/obj/O = disk_loc
dat += "in \a [O.name] "
@@ -425,19 +426,19 @@
if(!M)
dat += "| Head Revolutionary not found! |
"
else
- dat += "| [M.real_name] (Leader)[M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""] | "
- dat += "PM |
"
+ dat += "| [M.real_name] (Leader)[M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "PM |
"
for(var/datum/mind/N in ticker.mode.revolutionaries)
var/mob/M = N.current
if(M)
- dat += "| [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""] | "
- dat += "PM |
"
+ dat += "| [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "PM |
"
dat += "
| Target(s) | | Location |
"
for(var/datum/mind/N in ticker.mode.get_living_heads())
var/mob/M = N.current
if(M)
- dat += "| [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""] | "
- dat += "PM | "
+ dat += "
| [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "PM | "
var/turf/mob_loc = get_turf_loc(M)
dat += "[mob_loc.loc] |
"
else
@@ -449,9 +450,9 @@
for(var/datum/mind/changeling in ticker.mode.changelings)
var/mob/M = changeling.current
if(M)
- dat += "| [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""] | "
- dat += "PM | "
- dat += "Show Objective |
"
+ dat += "| [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "PM | "
+ dat += "Show Objective |
"
else
dat += "| Changeling not found! |
"
dat += "
"
@@ -461,9 +462,9 @@
for(var/datum/mind/wizard in ticker.mode.wizards)
var/mob/M = wizard.current
if(M)
- dat += "| [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""] | "
- dat += "PM | "
- dat += "Show Objective |
"
+ dat += "| [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "PM | "
+ dat += "Show Objective |
"
else
dat += "| Wizard not found! |
"
dat += ""
@@ -473,8 +474,8 @@
for(var/datum/mind/N in ticker.mode.cult)
var/mob/M = N.current
if(M)
- dat += "| [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""] | "
- dat += "PM |
"
+ dat += "| [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "PM |
"
dat += ""
if(ticker.mode.traitors.len > 0)
@@ -482,9 +483,9 @@
for(var/datum/mind/traitor in ticker.mode.traitors)
var/mob/M = traitor.current
if(M)
- dat += "| [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""] | "
- dat += "PM | "
- dat += "Show Objective |
"
+ dat += "| [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""] | "
+ dat += "PM | "
+ dat += "Show Objective |
"
else
dat += "| Traitor not found! |
"
dat += ""
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 8462b271f1a..c78537d420e 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1343,7 +1343,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) (JMP) (CA)"
else if(href_list["adminspawncookie"])
if(!check_rights(R_ADMIN|R_FUN)) return
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index 56f0156dce2..2445db29315 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -35,12 +35,17 @@
//takes input from cmd_admin_pm_context, cmd_admin_pm_panel or /client/Topic and sends them a PM.
//Fetching a message if needed. src is the sender and C is the target client
-/client/proc/cmd_admin_pm(var/client/C, var/msg)
+/client/proc/cmd_admin_pm(whom, msg)
if(prefs.muted & MUTE_ADMINHELP)
src << "Error: Admin-PM: You are unable to use admin PM-s (muted)."
return
-
- if(!istype(C,/client))
+
+ var/client/C
+ if(istext(whom))
+ C = directory[whom]
+ else if(istype(whom,/client))
+ C = whom
+ if(!C)
if(holder) src << "Error: Admin-PM: Client not found."
else adminhelp(msg) //admin we are replying to left. adminhelp instead
return
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index e462eeb5b4b..171c31fabb9 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -29,20 +29,9 @@
return
next_allowed_topic_time = world.time + TOPIC_SPAM_DELAY
- //search the href for script injection
- if( findtext(href,"