diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index b413d27fc98..5f40eea6e63 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..617454e911f 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_notes.dm b/code/modules/admin/player_notes.dm
index 70de3b1c125..66b409d439b 100644
--- a/code/modules/admin/player_notes.dm
+++ b/code/modules/admin/player_notes.dm
@@ -12,19 +12,19 @@ datum/admins/proc/notes_gethtml(var/ckey)
var/savefile/notesfile = new(NOTESFILE)
if(!notesfile) return "Error: Cannot access [NOTESFILE]"
if(ckey)
- . = "Notes for [ckey]: \[+\] \[-\]
"
+ . = "Notes for [ckey]: \[+\] \[-\]
"
notesfile.cd = "/[ckey]"
var/index = 1
while( !notesfile.eof )
var/note
notesfile >> note
- . += "[note] \[-\]
"
+ . += "[note] \[-\]
"
index++
else
- . = "All Notes: \[+\] \[-\]
"
+ . = "All Notes: \[+\] \[-\]
"
notesfile.cd = "/"
for(var/dir in notesfile.dir)
- . += "[dir]
"
+ . += "[dir]
"
return
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index cc389291a3c..933632719d5 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
|
@@ -265,23 +266,9 @@
else if(isobserver(M))
M_job = "Ghost"
- M_job = replacetext(M_job, "'", "")
- M_job = replacetext(M_job, "\"", "")
- M_job = replacetext(M_job, "\\", "")
-
- var/M_name = M.name
- M_name = replacetext(M_name, "'", "")
- M_name = replacetext(M_name, "\"", "")
- M_name = replacetext(M_name, "\\", "")
- var/M_rname = M.real_name
- M_rname = replacetext(M_rname, "'", "")
- M_rname = replacetext(M_rname, "\"", "")
- M_rname = replacetext(M_rname, "\\", "")
-
- var/M_key = M.key
- M_key = replacetext(M_key, "'", "")
- M_key = replacetext(M_key, "\"", "")
- M_key = replacetext(M_key, "\\", "")
+ var/M_name = html_encode(M.name)
+ var/M_rname = html_encode(M.real_name)
+ var/M_key = html_encode(M.key)
//output for each mob
dat += {"
@@ -319,7 +306,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 +347,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 +371,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 +397,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 +412,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 +436,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 +448,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 +460,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 +469,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..038c47c7545 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -828,11 +828,6 @@
//Player Notes
else if(href_list["notes"])
var/ckey = href_list["ckey"]
- if(!ckey)
- var/mob/M = locate(href_list["mob"])
- if(ismob(M))
- ckey = M.ckey
-
switch(href_list["notes"])
if("show")
notes_show(ckey)
@@ -933,16 +928,7 @@
else if(href_list["mute"])
if(!check_rights(R_ADMIN)) return
-
- var/mob/M = locate(href_list["mute"])
- if(!ismob(M)) return
- if(!M.client) return
-
- var/mute_type = href_list["mute_type"]
- if(istext(mute_type)) mute_type = text2num(mute_type)
- if(!isnum(mute_type)) return
-
- cmd_admin_mute(M, mute_type)
+ cmd_admin_mute(href_list["mute"], text2num(href_list["mute_type"]))
else if(href_list["c_mode"])
if(!check_rights(R_ADMIN)) return
@@ -1343,7 +1329,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/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 57386b591a5..0ed8c77b7b7 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -120,25 +120,12 @@
feedback_add_details("admin_verb","GOD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0)
- if(automute)
- if(!config.automute_on) return
- else
- if(!usr || !usr.client)
- return
- if(!usr.client.holder)
- usr << "Error: cmd_admin_mute: You don't have permission to do this."
- return
- if(!M.client)
- usr << "Error: cmd_admin_mute: This mob doesn't have a client tied to it."
- if(M.client.holder)
- usr << "Error: cmd_admin_mute: You cannot mute an admin."
- if(!M.client) return
- if(M.client.holder) return
+proc/cmd_admin_mute(whom, mute_type, automute = 0)
+ if(!whom)
+ return
var/muteunmute
var/mute_string
-
switch(mute_type)
if(MUTE_IC) mute_string = "IC (say and emote)"
if(MUTE_OOC) mute_string = "OOC"
@@ -147,26 +134,45 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0)
if(MUTE_DEADCHAT) mute_string = "deadchat and DSAY"
if(MUTE_ALL) mute_string = "everything"
else return
+
+ var/client/C
+ if(istype(whom, /client))
+ C = whom
+ else if(istext(whom))
+ C = directory[whom]
+ else
+ return
+
+ var/datum/preferences/P
+ if(C) P = C.prefs
+ else P = preferences_datums[whom]
+ if(!P) return
+
+ if(automute)
+ if(!config.automute_on) return
+ else
+ if(!check_rights())
+ return
if(automute)
muteunmute = "auto-muted"
- M.client.prefs.muted |= mute_type
- log_admin("SPAM AUTOMUTE: [muteunmute] [key_name(M)] from [mute_string]")
- message_admins("SPAM AUTOMUTE: [muteunmute] [key_name_admin(M)] from [mute_string].", 1)
- M << "You have been [muteunmute] from [mute_string] by the SPAM AUTOMUTE system. Contact an admin."
+ P.muted |= mute_type
+ log_admin("SPAM AUTOMUTE: [muteunmute] [key_name(whom)] from [mute_string]")
+ message_admins("SPAM AUTOMUTE: [muteunmute] [key_name_admin(whom)] from [mute_string].", 1)
+ if(C) C << "You have been [muteunmute] from [mute_string] by the SPAM AUTOMUTE system. Contact an admin."
feedback_add_details("admin_verb","AUTOMUTE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
- if(M.client.prefs.muted & mute_type)
+ if(P.muted & mute_type)
muteunmute = "unmuted"
- M.client.prefs.muted &= ~mute_type
+ P.muted &= ~mute_type
else
muteunmute = "muted"
- M.client.prefs.muted |= mute_type
+ P.muted |= mute_type
- log_admin("[key_name(usr)] has [muteunmute] [key_name(M)] from [mute_string]")
- message_admins("[key_name_admin(usr)] has [muteunmute] [key_name_admin(M)] from [mute_string].", 1)
- M << "You have been [muteunmute] from [mute_string]."
+ log_admin("[key_name(usr)] has [muteunmute] [key_name(whom)] from [mute_string]")
+ message_admins("[key_name_admin(usr)] has [muteunmute] [key_name_admin(whom)] from [mute_string].", 1)
+ if(C) C << "You have been [muteunmute] from [mute_string]."
feedback_add_details("admin_verb","MUTE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index e462eeb5b4b..5d3b65f9047 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,"