diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index c1626ab99a..b307bc1694 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -475,68 +475,52 @@ Turf and target are seperate in case you want to teleport some distance from a t
/proc/key_name(var/whom, var/include_link = null, var/include_name = 1)
- var/mob/the_mob = null
- var/client/the_client = null
- var/the_key = ""
+ var/mob/M
+ var/client/C
+ var/key
- if (isnull(whom))
- return "*null*"
- else if (istype(whom, /client))
- the_client = whom
- the_mob = the_client.mob
- the_key = the_client.key
- else if (ismob(whom))
- the_mob = whom
- the_client = the_mob.client
- the_key = the_mob.key
- else if (istype(whom, /datum))
- var/datum/the_datum = whom
- return "*invalid:[the_datum.type]*"
+ if(!whom) return "*null*"
+ if(istype(whom, /client))
+ C = whom
+ M = C.mob
+ key = C.key
+ 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]*"
else
return "*invalid*"
- var/text = ""
+ . = ""
- if (!the_key)
- text += "*no client*"
- else
- var/linked = 1
- if (include_link && !isnull(the_mob))
- if (istext(include_link))
- text += ""
- else
- if(ismob(include_link))
- var/mob/MM = include_link
- if(MM.client)
- text += ""
- else
- linked = 0
- else if (istype(include_link, /client))
- text += ""
- else
- linked = 0
+ if(key)
+ if(include_link && C)
+ . += ""
- if (the_client && the_client.holder && the_client.holder.fakekey && !include_name)
- text += "Administrator"
+ if(C && C.holder && C.holder.fakekey && !include_name)
+ . += "Administrator"
else
- text += "[the_key]"
+ . += key
- if (!isnull(include_link) && !isnull(the_mob))
- if(linked)
- text += ""
- else
- text += " (DC)"
+ if(include_link)
+ if(C) . += ""
+ else . += " (DC)"
+ else
+ . += "*no key*"
- if (include_name && !isnull(the_mob))
- if (the_mob.real_name)
- text += "/([the_mob.real_name])"
- else if (the_mob.name)
- text += "/([the_mob.name])"
+ if(include_name && M)
+ if(M.real_name)
+ . += "/([M.real_name])"
+ else if(M.name)
+ . += "/([M.name])"
- return text
+ return .
/proc/key_name_admin(var/whom, var/include_name = 1)
- return key_name(whom, "%admin_ref%", include_name)
+ return key_name(whom, 1, include_name)
// Registers the on-close verb for a browse window (client/verb/.windowclose)
diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm
index fcd2c73012..d659d2fa68 100644
--- a/code/controllers/verbs.dm
+++ b/code/controllers/verbs.dm
@@ -24,7 +24,7 @@
if("Supply Shuttle")
supply_shuttle.process()
feedback_add_details("admin_verb","RSupply")
- message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.", 1)
+ message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.")
return
@@ -74,5 +74,5 @@
if("Cameras")
debug_variables(cameranet)
feedback_add_details("admin_verb","DCameras")
- message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.", 1)
+ message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.")
return
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index 968f25ba52..d83e773bcc 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -417,7 +417,7 @@ client
var/new_name = copytext(sanitize(input(usr,"What would you like to name this mob?","Input a name",M.real_name) as text|null),1,MAX_NAME_LEN)
if( !new_name || !M ) return
- message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].", 1)
+ message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(M)] to [new_name].")
M.fully_replace_character_name(M.real_name,new_name)
href_list["datumrefresh"] = href_list["rename"]
@@ -590,7 +590,7 @@ client
usr << "No objects of this type exist"
return
log_admin("[key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ")
- message_admins("\blue [key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ", 1)
+ message_admins("\blue [key_name(usr)] deleted all objects of type [O_type] ([i] objects deleted) ")
if("Type and subtypes")
var/i = 0
for(var/obj/Obj in world)
@@ -601,7 +601,7 @@ client
usr << "No objects of this type exist"
return
log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
- message_admins("\blue [key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ", 1)
+ message_admins("\blue [key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted) ")
else if(href_list["explode"])
if(!check_rights(0)) return
@@ -774,7 +774,7 @@ client
if(amount != 0)
log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [L] ")
- message_admins("\blue [key_name(usr)] dealt [amount] amount of [Text] damage to [L] ", 1)
+ message_admins("\blue [key_name(usr)] dealt [amount] amount of [Text] damage to [L] ")
href_list["datumrefresh"] = href_list["mobToDamage"]
else
. = 0
diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm
index 25c4262b4e..aed6a302a2 100644
--- a/code/datums/diseases/advance/advance.dm
+++ b/code/datums/diseases/advance/advance.dm
@@ -424,6 +424,6 @@ var/list/archive_diseases = list()
var/list/name_symptoms = list()
for(var/datum/symptom/S in D.symptoms)
name_symptoms += S.name
- message_admins("[key_name_admin(user)] has triggered a custom virus outbreak of [D.name]! It has these symptoms: [english_list(name_symptoms)]", 1)
+ message_admins("[key_name_admin(user)] has triggered a custom virus outbreak of [D.name]! It has these symptoms: [english_list(name_symptoms)]")
#undef RANDOM_STARTING_LEVEL
\ No newline at end of file
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index fc5cf3dd58..92629558ae 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -750,7 +750,7 @@ datum/mind
var/mob/living/carbon/monkey/M = current
if (istype(H))
log_admin("[key_name(usr)] attempting to monkeyize [key_name(current)]")
- message_admins("\blue [key_name_admin(usr)] attempting to monkeyize [key_name_admin(current)]", 1)
+ message_admins("\blue [key_name_admin(usr)] attempting to monkeyize [key_name_admin(current)]")
src = null
M = H.monkeyize()
src = M.mind
@@ -780,7 +780,7 @@ datum/mind
D.cure(0)
sleep(0) //because deleting of virus is doing throught spawn(0)
log_admin("[key_name(usr)] attempting to humanize [key_name(current)]")
- message_admins("\blue [key_name_admin(usr)] attempting to humanize [key_name_admin(current)]", 1)
+ message_admins("\blue [key_name_admin(usr)] attempting to humanize [key_name_admin(current)]")
var/obj/item/weapon/dnainjector/m2h/m2h = new
var/obj/item/weapon/implant/mobfinder = new(M) //hack because humanizing deletes mind --rastaf0
src = null
diff --git a/code/game/gamemodes/events/ninja_equipment.dm b/code/game/gamemodes/events/ninja_equipment.dm
index e7f64d6e30..e0047e2d3c 100644
--- a/code/game/gamemodes/events/ninja_equipment.dm
+++ b/code/game/gamemodes/events/ninja_equipment.dm
@@ -593,7 +593,7 @@ ________________________________________________________________________________
grant_kamikaze(U)//Give them verbs and change variables as necessary.
U.regenerate_icons()//Update their clothing.
ninjablade()//Summon two energy blades.
- message_admins("\blue [U.key] used KAMIKAZE mode.", 1)//Let the admins know.
+ message_admins("\blue [key_name_admin(U)] used KAMIKAZE mode.")//Let the admins know.
s_busy = 0
return
sleep(s_delay)
diff --git a/code/game/gamemodes/events/space_ninja.dm b/code/game/gamemodes/events/space_ninja.dm
index 76b0162cfb..4931b2129e 100644
--- a/code/game/gamemodes/events/space_ninja.dm
+++ b/code/game/gamemodes/events/space_ninja.dm
@@ -475,7 +475,7 @@ As such, it's hard-coded for now. No reason for it not to be, really.
space_ninja_arrival(input, mission)
- message_admins("\blue [key] has spawned [input] as a Space Ninja.\nTheir mission is: [mission]", 1)
+ message_admins("\blue [key_name_admin(key)] has spawned [input] as a Space Ninja.\nTheir mission is: [mission]")
log_admin("[key] used Spawn Space Ninja.")
return
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 43a0113939..2660f015a9 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -84,7 +84,7 @@
if(security_level != old_level)
//Only notify the admins if an actual change happened
log_game("[key_name(usr)] has changed the security level to [get_security_level()].")
- message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].", 1)
+ message_admins("[key_name_admin(usr)] has changed the security level to [get_security_level()].")
switch(security_level)
if(SEC_LEVEL_GREEN)
feedback_inc("alert_comms_green",1)
diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm
index 33c704545a..5205de3393 100644
--- a/code/game/verbs/who.dm
+++ b/code/game/verbs/who.dm
@@ -27,7 +27,7 @@
entry += " - DEAD"
if(is_special_character(C.mob))
entry += " - Antagonist"
- entry += " (?)"
+ entry += " (?)"
Lines += entry
else
for(var/client/C in clients)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index bb5b3b9489..b59206366f 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1,5 +1,6 @@
/datum/admins/Topic(href, href_list)
..()
+
if(usr.client != src.owner || !check_rights(0))
world << "\blue [usr.key] has attempted to override the admin panel!"
log_admin("[key_name(usr)] tried to use the admin panel without authorization.")
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index 031395eb78..e3ab99954b 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -1,122 +1,101 @@
//This is a list of words which are ignored by the parser when comparing message contents for names. MUST BE IN LOWER CASE!
-var/list/adminhelp_ignored_words = list("unknown","the","a","an", "monkey", "alien", "as")
+var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","alien","as")
/client/verb/adminhelp(msg as text)
set category = "Admin"
set name = "Adminhelp"
+ //handle muting and automuting
if(muted & MUTE_ADMINHELP)
src << "Error: Admin-PM: You cannot send adminhelps (Muted)."
return
-
- if (src.handle_spam_prevention(msg,MUTE_ADMINHELP))
+ if(src.handle_spam_prevention(msg,MUTE_ADMINHELP))
return
+ //remove out adminhelp verb temporarily to prevent spamming of admins.
src.verbs -= /client/verb/adminhelp
spawn(1200)
src.verbs += /client/verb/adminhelp // 2 minute cool-down for adminhelps
+ //clean the input msg
if(!msg) return
msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN))
- if (!msg) return
-
+ if(!msg) return
var/original_msg = msg
- //The symbol × (fancy multiplication sign) will be used to mark where to put replacements, so the original message must not contain it.
- msg = replacetext(msg, "×", "")
- msg = replacetext(msg, "HOLDERREF", "HOLDER-REF") //HOLDERREF is a key word which gets replaced with the admin's holder ref later on, so it mustn't be in the original message
- msg = replacetext(msg, "ADMINREF", "ADMIN-REF") //ADMINREF is a key word which gets replaced with the admin's client's ref. So it mustn't be in the original message.
-
+ //explode the input msg into a list
var/list/msglist = text2list(msg, " ")
- var/list/mob/mobs = list()
-
+ //generate keywords lookup
+ var/list/surnames = list()
+ var/list/forenames = list()
+ var/list/ckeys = list()
for(var/mob/M in mob_list)
- mobs += M
+ var/list/indexing = list(M.real_name, M.name)
+ if(M.mind) indexing += M.mind.name
- var/list/replacement_value = list() //When a word match is found, the word matched will get replaced with an × (fancy multiplication symbol).
- //This list will contain a list of values which the × will be replaced with in the same order as indexes in this list.
- //So if this list has the value list("John","Jane") and msg is, at the end, "This is × and he griffed ×" the text to
- //display will be "This is John and he griffe Jane". The strings in this list are a bit more complex than 'John' and 'Jane' tho.
-
- var/ai_found = 0 //If an AI name or 'ai' word is found in the text, the additional (CL) = Check Laws button gets added. Not added every time so it doesn't spam.
-
- //we will try to locate each word of the message in our lists of names and clients
- //for each mob that we have found
- //split the mob's info into a list. "John Arnolds" becomes list("John","Arnolds") so we can iterate through this
- //for each of the name parts IE. "John", "Arnolds", etc. in the current name.
- for(var/i = 1; i <= msglist.len; i++)
- var/word = msglist[i]
- var/original_word = word
- word = replacetext(word, ".", "")
- word = replacetext(word, ",", "")
- word = replacetext(word, "!", "")
- word = replacetext(word, "?", "") //Strips some common punctuation characters so the actual word can be better compared.
- word = replacetext(word, ";", "")
- word = replacetext(word, ":", "")
- word = replacetext(word, "(", "")
- word = replacetext(word, ")", "")
- if(lowertext(word) in adminhelp_ignored_words)
- continue
- if(lowertext(word) == "ai")
- ai_found = 1
- continue
- for(var/mob/M in mobs)
- var/list/namelist = text2list("[M.name] [M.real_name] [(M.mind)?"[M.mind.name]":""] [M.ckey] [M.key]", " ")
- var/word_is_match = 0 //Used to break from this mob for loop if a match is found
- for(var/namepart in namelist)
- if( lowertext(word) == lowertext(namepart) )
- msglist[i] = "×"
- var/description_string = "[original_word] (?)"
- replacement_value += description_string
- mobs -= M //If a mob is found then remove it from the list of mobs, so we don't get the same mob reported a million times.
- word_is_match = 1
+ for(var/string in indexing)
+ var/list/L = text2list(string, " ")
+ var/surname_found = 0
+ //surnames
+ for(var/i=L.len, i>=1, i--)
+ var/word = ckey(L[i])
+ if(word)
+ surnames[word] = M
+ surname_found = i
break
- if(word_is_match)
- if(isAI(M))
+ //forenames
+ for(var/i=1, i[original_word] (?) "
+ continue
+ msg += "[original_word] "
- var/j = 1 //index to the next element in the replacement_value list
- for(var/i = 1; i <= msglist.len; i++)
- var/word = msglist[i]
- if(word == "×")
- msglist[i] = replacement_value[j]
- j++
+ if(!mob) return //this doesn't happen
- msg = dd_list2text(msglist, " ")
+ var/ref_mob = "\ref[mob]"
+ msg = "\blue HELP: [key_name(src, 1)] (?) (PP) (VV) (SM) (JMP) (CA) [ai_found ? " (CL)" : ""]: [msg]"
+
+ //send this msg to all admins
var/admin_number_afk = 0
+ for(var/client/X in admins)
+ if(X.is_afk())
+ admin_number_afk++
+ if(X.holder.sound_adminhelp)
+ X << 'sound/effects/adminhelp.ogg'
+ X << msg
- if(mob)
- var/ref_mob = "\ref[src.mob]"
- for(var/client/X in admins)
- if( X.inactivity > AFK_THRESHOLD ) //When I made this, the AFK_THRESHOLD was 3000ds = 300s = 5m, see setup.dm for the new one.
- admin_number_afk++
- if(X.holder.sound_adminhelp)
- X << 'sound/effects/adminhelp.ogg'
- var/check_laws_text = ""
- if(ai_found)
- check_laws_text = (" (CL)")
-
- var/msg_to_send = "\blue HELP: [key_name(src, X)] (?) (PP) (VV) (SM) (JMP) (CA) [check_laws_text]: [msg]"
- msg_to_send = replacetext(msg_to_send, "HOLDERREF", "\ref[X.holder]")
- msg_to_send = replacetext(msg_to_send, "ADMINREF", "\ref[X]")
- X << msg_to_send
- else
- var/ref_client = "\ref[src]"
- for(var/client/X in admins)
- if( X.inactivity > AFK_THRESHOLD ) //When I made this, the AFK_THRESHOLD was 3000ds = 300s = 5m, see setup.dm for the new one.
- admin_number_afk++
- if(X.holder.sound_adminhelp)
- X << 'sound/effects/adminhelp.ogg'
- var/msg_to_send = "\blue HELP: [key_name(src, X)] (VV) (CA): [msg]"
- msg_to_send = replacetext(msg_to_send, "HOLDERREF", "\ref[X.holder]")
- msg_to_send = replacetext(msg_to_send, "ADMINREF", "\ref[X]")
- X << msg_to_send
- var/admin_number_present = admins.len - admin_number_afk
+ //show it to the person adminhelping too
src << "PM to-Admins: [original_msg]"
+
+ var/admin_number_present = admins.len - admin_number_afk
log_admin("HELP: [key_name(src)]: [original_msg] - heard by [admin_number_present] non-AFK admins.")
if(admin_number_present <= 0)
if(!admin_number_afk)
diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm
index 835665aaba..5adb784a25 100644
--- a/code/modules/admin/verbs/adminsay.dm
+++ b/code/modules/admin/verbs/adminsay.dm
@@ -6,14 +6,15 @@
msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)
if(!msg) return
-
- if(check_rights(R_ADMIN,0))
- for(var/client/C in admins)
- C << "ADMIN: [key_name(usr, C)] (JMP): [msg]"
- else
- for(var/client/C in admins)
- C << "ADMIN: [key_name(usr, C)]: [msg]"
-
+
log_admin("[key_name(src)] : [msg]")
+
+ if(check_rights(R_ADMIN,0))
+ msg = "ADMIN: [key_name(usr, 1)] (JMP): [msg]"
+ admins << msg
+ else
+ msg = "ADMIN: [key_name(usr, 1)]: [msg]"
+ admins << msg
+
feedback_add_details("admin_verb","M") //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 d154f157ed..3a782741ac 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -3,36 +3,32 @@
set name = "Pray"
msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)
+ if(!msg) return
- if (!msg)
- return
-
- if (usr.client)
+ if(usr.client)
if(usr.client.muted & MUTE_PRAY)
usr << "\red You cannot pray (muted)."
return
-
- if (src.client.handle_spam_prevention(msg,MUTE_PRAY))
+ if(src.client.handle_spam_prevention(msg,MUTE_PRAY))
return
- var/icon/cross = icon('icons/obj/storage.dmi',"bible")
-
+ 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]"
+
for(var/client/C in admins)
if(C.seeprayers)
- C << "\blue \icon[cross] PRAY: [key_name(src, C)] (?) (PP) (VV) (SM) (JMP) (CA) (SC): [msg]"
-
+ C << msg
usr << "Your prayers have been received by the gods."
+
feedback_add_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
//log_admin("HELP: [key_name(src)]: [msg]")
-
/proc/Centcomm_announce(var/text , var/mob/Sender)
var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN)
- for(var/client/C in admins)
- C << "\blue CENTCOMM:[key_name(Sender, C)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]"
+ msg = "\blue CENTCOMM:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]"
+ admins << msg
/proc/Syndicate_announce(var/text , var/mob/Sender)
var/msg = copytext(sanitize(text), 1, MAX_MESSAGE_LEN)
- for(var/client/C in admins)
- C << "\blue SYNDICATE:[key_name(Sender, C)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]"
-
+ msg = "\blue SYNDICATE:[key_name(Sender, 1)] (PP) (VV) (SM) (JMP) (CA) (BSA) (RPLY): [msg]"
+ admins << msg
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index 5256c106b6..19f6ef3edd 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -47,12 +47,16 @@
//Logs all hrefs
if(config && config.log_hrefs && href_logfile)
- href_logfile << "[time2text(world.timeofday,"hh:mm")] [src] (usr:[usr]) || [href]
"
+ href_logfile << "[time2text(world.timeofday,"hh:mm")] [src] (usr:[usr]) || [hsrc ? "[hsrc] " : ""][href]
"
+
+ switch(href_list["_src_"])
+ if("holder") hsrc = usr.client.holder
+ if("usr") hsrc = usr
if(view_var_Topic(href,href_list,hsrc)) //Until viewvars can be rewritten as datum/admins/Topic()
return
- ..() //redirect to [locate(hsrc)]/Topic()
+ ..() //redirect to hsrc.Topic()
/client/proc/handle_spam_prevention(var/message, var/mute_type)
if(config.automute_on && !holder && src.last_message == message)
@@ -181,6 +185,6 @@
//checks if a client is afk
//3000 frames = 5 minutes
-/client/proc/is_afk(duration=3000)
+/client/proc/is_afk(duration=AFK_THRESHOLD)
if(inactivity > duration) return inactivity
return 0
\ No newline at end of file