Bleeding edgy refresh (#303)

* not code stuff

* other things

* global vars, defines, helpers

* onclick hud stuff, orphans, world.dm

* controllers and datums

* game folder

* everything not client/mobs in modules

* client folder

* stage 1 mob stuff

* simple animal things

* silicons

* carbon things

* ayylmaos and monkeys

* hyoomahn

* icons n shit

* sprite fixes

* compile fixes

* some fixes I cherrypicked.

* qdel fixes

* forgot brain refractors
This commit is contained in:
Poojawa
2017-03-21 11:44:10 -05:00
committed by GitHub
parent 099a6c8764
commit f67e9f6d87
1476 changed files with 344416 additions and 40694 deletions
+1 -1
View File
@@ -29,6 +29,6 @@
var/F = file("broken_icons.txt")
fdel(F)
F << text
world << "Completely successfully and written to [F]"
to_chat(world, "Completely successfully and written to [F]")
+81 -80
View File
@@ -18,10 +18,6 @@
*/
/datum/proc/SDQL_update(const/var_name, new_value)
vars[var_name] = new_value
return TRUE
/client/proc/SDQL2_query(query_text as message)
set category = "Debug"
if(!check_rights(R_DEBUG)) //Shouldn't happen... but just to be safe.
@@ -38,7 +34,7 @@
if(!query_text || length(query_text) < 1)
return
//world << query_text
//to_chat(world, query_text)
var/list/query_list = SDQL2_tokenize(query_text)
@@ -75,15 +71,8 @@
var/list/objs = list()
for(var/type in select_types)
var/char = copytext(type, 1, 2)
if(char == "/" || char == "*")
for(var/from in from_objs)
objs += SDQL_get_all(type, from)
CHECK_TICK
else if(char == "'" || char == "\"")
objs += locate(copytext(type, 2, length(type)))
objs += SDQL_get_all(type, from_objs)
CHECK_TICK
if("where" in query_tree)
var/objs_temp = objs
@@ -95,19 +84,8 @@
switch(query_tree[1])
if("call")
var/list/call_list = query_tree["call"]
var/list/args_list = query_tree["args"]
for(var/datum/d in objs)
var/list/new_args = list()
for(var/a in args_list)
new_args += SDQL_expression(d,a)
for(var/v in call_list)
if(copytext(v,1,8) == "global.")
v = "/proc/[copytext(v,8)]"
SDQL_callproc_global(v,new_args)
else
SDQL_callproc(d, v, new_args)
SDQL_var(d, query_tree["call"][1], source = d)
CHECK_TICK
if("delete")
@@ -146,7 +124,7 @@
var/i = 0
for(var/v in sets)
if(++i == sets.len)
temp.SDQL_update(v, SDQL_expression(d, set_list[sets]))
temp.vv_edit_var(v, SDQL_expression(d, set_list[sets]))
break
if(temp.vars.Find(v) && (istype(temp.vars[v], /datum)))
temp = temp.vars[v]
@@ -155,10 +133,10 @@
CHECK_TICK
catch(var/exception/e)
usr << "<span class='boldwarning'>A runtime error has occured in your SDQL2-query.</span>"
usr << "\[NAME\][e.name]"
usr << "\[FILE\][e.file]"
usr << "\[LINE\][e.line]"
to_chat(usr, "<span class='boldwarning'>A runtime error has occured in your SDQL2-query.</span>")
to_chat(usr, "\[NAME\][e.name]")
to_chat(usr, "\[FILE\][e.file]")
to_chat(usr, "\[LINE\][e.line]")
/proc/SDQL_callproc_global(procname,args_list)
set waitfor = FALSE
@@ -193,7 +171,7 @@
querys[querys_pos] = parsed_tree
querys_pos++
else //There was an error so don't run anything, and tell the user which query has errored.
usr << "<span class='danger'>Parsing error on [querys_pos]\th query. Nothing was executed.</span>"
to_chat(usr, "<span class='danger'>Parsing error on [querys_pos]\th query. Nothing was executed.</span>")
return list()
query_tree = list()
do_parse = 0
@@ -214,51 +192,36 @@
for(var/item in query_tree)
if(istype(item, /list))
usr << "[spaces]("
to_chat(usr, "[spaces](")
SDQL_testout(item, indent + 1)
usr << "[spaces])"
to_chat(usr, "[spaces])")
else
usr << "[spaces][item]"
to_chat(usr, "[spaces][item]")
if(!isnum(item) && query_tree[item])
if(istype(query_tree[item], /list))
usr << "[spaces] ("
to_chat(usr, "[spaces] (")
SDQL_testout(query_tree[item], indent + 2)
usr << "[spaces] )"
to_chat(usr, "[spaces] )")
else
usr << "[spaces] [query_tree[item]]"
to_chat(usr, "[spaces] [query_tree[item]]")
/proc/SDQL_from_objs(list/tree)
if("world" in tree)
return list(world)
var/list/out = list()
for(var/type in tree)
var/char = copytext(type, 1, 2)
if(char == "/")
out += SDQL_get_all(type, world)
else if(char == "'" || char == "\"")
out += locate(copytext(type, 2, length(type)))
return out
return world
return SDQL_expression(world, tree)
/proc/SDQL_get_all(type, location)
var/list/out = list()
if(type == "*")
for(var/datum/d in location)
out += d
return out
// If only a single object got returned, wrap it into a list so the for loops run on it.
if(!islist(location) && location != world)
location = list(location)
type = text2path(type)
var/typecache = typecacheof(type)
@@ -355,7 +318,7 @@
if("or", "||")
result = (result || val)
else
usr << "<span class='danger'>SDQL2: Unknown op [op]</span>"
to_chat(usr, "<span class='danger'>SDQL2: Unknown op [op]</span>")
result = null
else
result = val
@@ -398,51 +361,89 @@
else if(expression[i] == "\[")
var/list/expressions_list = expression[++i]
var/list/val2 = list()
val = list()
for(var/list/expression_list in expressions_list)
val2[++val2.len] = SDQL_expression(object, expression_list)
val = val2
var/result = SDQL_expression(object, expression_list)
var/assoc
if(expressions_list[expression_list] != null)
assoc = SDQL_expression(object, expressions_list[expression_list])
if(assoc != null)
// Need to insert the key like this to prevent duplicate keys fucking up.
var/list/dummy = list()
dummy[result] = assoc
result = dummy
val += result
else
val = SDQL_var(object, expression, i)
val = SDQL_var(object, expression, i, object)
i = expression.len
return list("val" = val, "i" = i)
/proc/SDQL_var(datum/object, list/expression, start = 1)
/proc/SDQL_var(datum/object, list/expression, start = 1, source)
var/v
if(expression[start] in object.vars)
v = object.vars[expression[start]]
else if(expression[start] == "{" && start < expression.len)
var/static/list/exclude = list("usr", "src", "marked", "global")
var/long = start < expression.len
if(object == world && long && expression[start + 1] == ".")
to_chat(usr, "Sorry, but global variables are not supported at the moment.")
return null
else if(expression [start] == "{" && long)
if(lowertext(copytext(expression[start + 1], 1, 3)) != "0x")
usr << "<span class='danger'>Invalid pointer syntax: [expression[start + 1]]</span>"
to_chat(usr, "<span class='danger'>Invalid pointer syntax: [expression[start + 1]]</span>")
return null
v = locate("\[[expression[start + 1]]]")
if(!v)
usr << "<span class='danger'>Invalid pointer: [expression[start + 1]]</span>"
to_chat(usr, "<span class='danger'>Invalid pointer: [expression[start + 1]]</span>")
return null
start++
else
else if((!long || expression[start + 1] == ".") && (expression[start] in object.vars))
v = object.vars[expression[start]]
else if(long && expression[start + 1] == ":" && hascall(object, expression[start]))
v = expression[start]
else if(!long || expression[start + 1] == ".")
switch(expression[start])
if("usr")
v = usr
if("src")
v = object
v = source
if("marked")
if(usr.client && usr.client.holder && usr.client.holder.marked_datum)
v = usr.client.holder.marked_datum
else
return null
if("global")
v = world
else
return null
if(start < expression.len && expression[start + 1] == ".")
return SDQL_var(v, expression[start + 2])
else
return v
else if(object == world) // Shitty ass hack kill me.
v = expression[start]
if(long)
if(expression[start + 1] == ".")
return SDQL_var(v, expression[start + 2], source = source)
else if(expression[start + 1] == ":")
return SDQL_function(object, v, expression[start + 2], source)
else if(expression[start + 1] == "\[" && islist(v))
var/list/L = v
var/index = SDQL_expression(source, expression[start + 2])
if(isnum(index) && (!IsInteger(index) || L.len < index))
to_chat(usr, "<span class='danger'>Invalid list index: [index]</span>")
return null
return L[index]
return v
/proc/SDQL_function(var/datum/object, var/procname, var/list/arguments, source)
set waitfor = FALSE
var/list/new_args = list()
for(var/arg in arguments)
new_args += SDQL_expression(source, arg)
if(object == world) // Global proc.
procname = "/proc/[procname]"
return call(procname)(arglist(new_args))
return call(object, procname)(arglist(new_args)) // Spawn in case the function sleeps.
/proc/SDQL2_tokenize(query_text)
var/list/whitespace = list(" ", "\n", "\t")
var/list/single = list("(", ")", ",", "+", "-", ".", ";", "{", "}", "\[", "]")
var/list/single = list("(", ")", ",", "+", "-", ".", ";", "{", "}", "\[", "]", ":")
var/list/multi = list(
"=" = list("", "="),
"<" = list("", "=", ">"),
@@ -484,7 +485,7 @@
else if(char == "'")
if(word != "")
usr << "\red SDQL2: You have an error in your SDQL syntax, unexpected ' in query: \"<font color=gray>[query_text]</font>\" following \"<font color=gray>[word]</font>\". Please check your syntax, and try again."
to_chat(usr, "\red SDQL2: You have an error in your SDQL syntax, unexpected ' in query: \"<font color=gray>[query_text]</font>\" following \"<font color=gray>[word]</font>\". Please check your syntax, and try again.")
return null
word = "'"
@@ -504,7 +505,7 @@
word += char
if(i > len)
usr << "\red SDQL2: You have an error in your SDQL syntax, unmatched ' in query: \"<font color=gray>[query_text]</font>\". Please check your syntax, and try again."
to_chat(usr, "\red SDQL2: You have an error in your SDQL syntax, unmatched ' in query: \"<font color=gray>[query_text]</font>\". Please check your syntax, and try again.")
return null
query_list += "[word]'"
@@ -512,7 +513,7 @@
else if(char == "\"")
if(word != "")
usr << "\red SDQL2: You have an error in your SDQL syntax, unexpected \" in query: \"<font color=gray>[query_text]</font>\" following \"<font color=gray>[word]</font>\". Please check your syntax, and try again."
to_chat(usr, "\red SDQL2: You have an error in your SDQL syntax, unexpected \" in query: \"<font color=gray>[query_text]</font>\" following \"<font color=gray>[word]</font>\". Please check your syntax, and try again.")
return null
word = "\""
@@ -532,7 +533,7 @@
word += char
if(i > len)
usr << "\red SDQL2: You have an error in your SDQL syntax, unmatched \" in query: \"<font color=gray>[query_text]</font>\". Please check your syntax, and try again."
to_chat(usr, "\red SDQL2: You have an error in your SDQL syntax, unmatched \" in query: \"<font color=gray>[query_text]</font>\". Please check your syntax, and try again.")
return null
query_list += "[word]\""
+66 -67
View File
@@ -62,7 +62,7 @@
/datum/SDQL_parser/proc/parse_error(error_message)
error = 1
usr << "<span class='danger'>SQDL2 Parsing Error: [error_message]</span>"
to_chat(usr, "<span class='danger'>SQDL2 Parsing Error: [error_message]</span>")
return query.len + 1
/datum/SDQL_parser/proc/parse()
@@ -116,18 +116,7 @@
i = select_list(i + 1, select)
node += "select"
node["select"] = select
var/list/from = list()
if(tokenl(i) in list("from", "in"))
i = from_list(i + 1, from)
else
from += "world"
node += "from"
node["from"] = from
if(tokenl(i) == "where")
var/list/where = list()
i = bool_expression(i + 1, where)
node += "where"
node["where"] = where
selectors(i, node)
return i
//delete_query: 'DELETE' select_list [('FROM' | 'IN') from_list] ['WHERE' bool_expression]
@@ -136,18 +125,7 @@
i = select_list(i + 1, select)
node += "delete"
node["delete"] = select
var/list/from = list()
if(tokenl(i) in list("from", "in"))
i = from_list(i + 1, from)
else
from += "world"
node += "from"
node["from"] = from
if(tokenl(i) == "where")
var/list/where = list()
i = bool_expression(i + 1, where)
node += "where"
node["where"] = where
selectors(i, node)
return i
//update_query: 'UPDATE' select_list [('FROM' | 'IN') from_list] 'SET' assignments ['WHERE' bool_expression]
@@ -156,52 +134,28 @@
i = select_list(i + 1, select)
node += "update"
node["update"] = select
var/list/from = list()
if(tokenl(i) in list("from", "in"))
i = from_list(i + 1, from)
else
from += "world"
node += "from"
node["from"] = from
if(tokenl(i) != "set")
i = parse_error("UPDATE has misplaced SET")
var/list/set_assignments = list()
i = assignments(i + 1, set_assignments)
node += "set"
node["set"] = set_assignments
if(tokenl(i) == "where")
var/list/where = list()
i = bool_expression(i + 1, where)
node += "where"
node["where"] = where
selectors(i, node)
return i
//call_query: 'CALL' call_function ['ON' select_list [('FROM' | 'IN') from_list] ['WHERE' bool_expression]]
/datum/SDQL_parser/proc/call_query(i, list/node)
var/list/func = list()
var/list/arguments = list()
i = call_function(i + 1, func, arguments)
i = variable(i + 1, func) // Yes technically does anything variable() matches but I don't care, if admins fuck up this badly then they shouldn't be allowed near SDQL.
node += "call"
node["call"] = func
node["args"] = arguments
if(tokenl(i) != "on")
return i
var/list/select = list()
i = select_list(i + 1, select)
node += "on"
node["on"] = select
var/list/from = list()
if(tokenl(i) in list("from", "in"))
i = from_list(i + 1, from)
else
from += "world"
node += "from"
node["from"] = from
if(tokenl(i) == "where")
var/list/where = list()
i = bool_expression(i + 1, where)
node += "where"
node["where"] = where
selectors(i, node)
return i
//select_list: select_item [',' select_list]
@@ -211,13 +165,6 @@
i = select_list(i + 1, node)
return i
//from_list: from_item [',' from_list]
/datum/SDQL_parser/proc/from_list(i, list/node)
i = from_item(i, node)
if(token(i) == ",")
i = from_list(i + 1, node)
return i
//assignments: assignment, [',' assignments]
/datum/SDQL_parser/proc/assignments(i, list/node)
i = assignment(i, node)
@@ -236,13 +183,33 @@
i = object_type(i, node)
return i
// Standardized method for handling the IN/FROM and WHERE options.
/datum/SDQL_parser/proc/selectors(i, list/node)
while (token(i))
var/tok = tokenl(i)
if(tok in list("from", "in"))
var/list/from = list()
i = from_item(i + 1, from)
node["from"] = from
continue
if(tok == "where")
var/list/where = list()
i = bool_expression(i + 1, where)
node["where"] = where
continue
parse_error("Expected either FROM, IN or WHERE token, found [token(i)] instead.")
return i + 1
if(!node.Find("from"))
node["from"] = list("world")
return i
//from_item: 'world' | object_type
/datum/SDQL_parser/proc/from_item(i, list/node)
if(token(i) == "world")
node += "world"
i++
else
i = object_type(i, node)
i = expression(i, node)
return i
//bool_expression: expression [bool_operator bool_expression]
@@ -280,6 +247,19 @@
if(token(i + 1) == ".")
L += "."
i = variable(i + 2, L)
else if(token(i + 1) == "(") // OH BOY PROC
var/list/arguments = list()
i = call_function(i, null, arguments)
L += ":"
L[++L.len] = arguments
else if(token(i + 1) == "\[")
var/list/expression = list()
i = expression(i + 2, expression)
if (token(i) != "]")
parse_error("Missing ] at the end of list access.")
L += "\["
L[++L.len] = expression
i++
else
i++
return i
@@ -291,17 +271,36 @@
return i + 1
node += token(i)
var/list/expression_list = list()
if(token(i + 1) != "]")
i++
if(token(i) != "]")
var/list/temp_expression_list = list()
var/tok
do
i = expression(i + 1, temp_expression_list)
if(token(i) == ",")
tok = token(i)
if(tok == "," || tok == ":")
if(temp_expression_list == null)
parse_error("Found ',' or ':' without expression in an array.")
return i + 1
expression_list[++expression_list.len] = temp_expression_list
temp_expression_list = list()
temp_expression_list = null
if(tok == ":")
temp_expression_list = list()
i = expression(i + 1, temp_expression_list)
expression_list[expression_list[expression_list.len]] = temp_expression_list
temp_expression_list = null
tok = token(i)
if(tok != ",")
if(tok == "]")
break
parse_error("Expected ',' or ']' after array assoc value, but found '[token(i)]'")
return i
i++
continue
temp_expression_list = list()
i = expression(i, temp_expression_list)
while(token(i) && token(i) != "]")
expression_list[++expression_list.len] = temp_expression_list
else
i++
if(temp_expression_list)
expression_list[++expression_list.len] = temp_expression_list
node[++node.len] = expression_list
return i + 1
+8 -8
View File
@@ -81,12 +81,12 @@
set name = "Adminhelp"
if(say_disabled) //This is here to try to identify lag problems
usr << "<span class='danger'>Speech is currently admin-disabled.</span>"
to_chat(usr, "<span class='danger'>Speech is currently admin-disabled.</span>")
return
//handle muting and automuting
if(prefs.muted & MUTE_ADMINHELP)
src << "<span class='danger'>Error: Admin-PM: You cannot send adminhelps (Muted).</span>"
to_chat(src, "<span class='danger'>Error: Admin-PM: You cannot send adminhelps (Muted).</span>")
return
if(src.handle_spam_prevention(msg,MUTE_ADMINHELP))
return
@@ -108,7 +108,7 @@
return //this doesn't happen
var/ref_client = "\ref[src]"
msg = "<span class='adminnotice'><b><font color=red>HELP: </font><A HREF='?priv_msg=[ckey];ahelp_reply=1'>[key_name(src)]</A> [ADMIN_QUE(mob)] [ADMIN_PP(mob)] [ADMIN_VV(mob)] [ADMIN_SM(mob)] [ADMIN_FLW(mob)] [ADMIN_TP(mob)] (<A HREF='?_src_=holder;rejectadminhelp=[ref_client]'>REJT</A>) (<A HREF='?_src_=holder;icissue=[ref_client]'>IC</A>):</b> [msg]</span>"
msg = "<span class='adminnotice'><b><font color=red>HELP: </font><A HREF='?priv_msg=[ckey];ahelp_reply=1'>[key_name(src)]</A> [ADMIN_QUE(mob)] [ADMIN_PP(mob)] [ADMIN_VV(mob)] [ADMIN_SM(mob)] [ADMIN_FLW(mob)] [ADMIN_TP(mob)] [ADMIN_SMITE(mob)] (<A HREF='?_src_=holder;rejectadminhelp=[ref_client]'>REJT</A>) (<A HREF='?_src_=holder;icissue=[ref_client]'>IC</A>):</b> [msg]</span>"
//send this msg to all admins
@@ -116,17 +116,17 @@
if(X.prefs.toggles & SOUND_ADMINHELP)
X << 'sound/effects/adminhelp.ogg'
window_flash(X, ignorepref = TRUE)
X << msg
to_chat(X, msg)
//show it to the person adminhelping too
src << "<span class='adminnotice'>PM to-<b>Admins</b>: [original_msg]</span>"
to_chat(src, "<span class='adminnotice'>PM to-<b>Admins</b>: [original_msg]</span>")
//send it to irc if nobody is on and tell us how many were on
var/admin_number_present = send2irc_adminless_only(ckey,original_msg)
log_admin_private("HELP: [key_name(src)]: [original_msg] - heard by [admin_number_present] non-AFK admins who have +BAN.")
if(admin_number_present <= 0)
src << "<span class='notice'>No active admins are online, your adminhelp was sent to the admin irc.</span>"
to_chat(src, "<span class='notice'>No active admins are online, your adminhelp was sent to the admin irc.</span>")
feedback_add_details("admin_verb","AH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
@@ -167,7 +167,7 @@
return
/proc/send2otherserver(source,msg,type = "Ahelp")
if(global.cross_allowed)
if(config.cross_allowed)
var/list/message = list()
message["message_sender"] = source
message["message"] = msg
@@ -175,7 +175,7 @@
message["key"] = global.comms_key
message["crossmessage"] = type
world.Export("[global.cross_address]?[list2params(message)]")
world.Export("[config.cross_address]?[list2params(message)]")
/proc/ircadminwho()
+12 -12
View File
@@ -3,7 +3,7 @@
set desc = "Area to jump to"
set category = "Admin"
if(!src.holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
if(!A)
@@ -18,7 +18,7 @@
var/turf/T = safepick(turfs)
if(!T)
src << "Nowhere to jump to!"
to_chat(src, "Nowhere to jump to!")
return
usr.forceMove(T)
log_admin("[key_name(usr)] jumped to [A]")
@@ -29,7 +29,7 @@
set name = "Jump to Turf"
set category = "Admin"
if(!src.holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
log_admin("[key_name(usr)] jumped to [T.x],[T.y],[T.z] in [T.loc]")
@@ -43,7 +43,7 @@
set name = "Jump to Mob"
if(!src.holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
log_admin("[key_name(usr)] jumped to [key_name(M)]")
@@ -55,14 +55,14 @@
feedback_add_details("admin_verb","JM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
A.forceMove(M.loc)
else
A << "This mob is not located in the game world."
to_chat(A, "This mob is not located in the game world.")
/client/proc/jumptocoord(tx as num, ty as num, tz as num)
set category = "Admin"
set name = "Jump to Coordinate"
if (!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
if(src.mob)
@@ -78,7 +78,7 @@
set name = "Jump to Key"
if(!src.holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
var/list/keys = list()
@@ -86,7 +86,7 @@
keys += M.client
var/selection = input("Please, select a player!", "Admin Jumping", null, null) as null|anything in sortKey(keys)
if(!selection)
src << "No keys found."
to_chat(src, "No keys found.")
return
var/mob/M = selection:mob
log_admin("[key_name(usr)] jumped to [key_name(M)]")
@@ -101,7 +101,7 @@
set name = "Get Mob"
set desc = "Mob to teleport"
if(!src.holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
log_admin("[key_name(usr)] teleported [key_name(M)]")
@@ -115,7 +115,7 @@
set desc = "Key to teleport"
if(!src.holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
var/list/keys = list()
@@ -139,7 +139,7 @@
set category = "Admin"
set name = "Send Mob"
if(!src.holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
var/area/A = input(usr, "Pick an area.", "Pick an area") in sortedAreas|null
if(A && istype(A))
@@ -148,5 +148,5 @@
log_admin("[key_name(usr)] teleported [key_name(M)] to [A]")
message_admins("[key_name_admin(usr)] teleported [key_name_admin(M)] to [A]")
else
src << "Failed to move mob to a valid location."
to_chat(src, "Failed to move mob to a valid location.")
feedback_add_details("admin_verb","SMOB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+24 -24
View File
@@ -6,7 +6,7 @@
set category = null
set name = "Admin PM Mob"
if(!holder)
src << "<font color='red'>Error: Admin-PM-Context: Only administrators may use this command.</font>"
to_chat(src, "<font color='red'>Error: Admin-PM-Context: Only administrators may use this command.</font>")
return
if( !ismob(M) || !M.client )
return
@@ -18,7 +18,7 @@
set category = "Admin"
set name = "Admin PM"
if(!holder)
src << "<font color='red'>Error: Admin-PM-Panel: Only administrators may use this command.</font>"
to_chat(src, "<font color='red'>Error: Admin-PM-Panel: Only administrators may use this command.</font>")
return
var/list/client/targets[0]
for(var/client/T)
@@ -37,7 +37,7 @@
/client/proc/cmd_ahelp_reply(whom)
if(prefs.muted & MUTE_ADMINHELP)
src << "<font color='red'>Error: Admin-PM: You are unable to use admin PM-s (muted).</font>"
to_chat(src, "<font color='red'>Error: Admin-PM: You are unable to use admin PM-s (muted).</font>")
return
var/client/C
if(istext(whom))
@@ -48,7 +48,7 @@
C = whom
if(!C)
if(holder)
src << "<font color='red'>Error: Admin-PM: Client not found.</font>"
to_chat(src, "<font color='red'>Error: Admin-PM: Client not found.</font>")
return
message_admins("[key_name_admin(src)] has started replying to [key_name(C, 0, 0)]'s admin help.")
var/msg = input(src,"Message:", "Private message to [key_name(C, 0, 0)]") as text|null
@@ -61,7 +61,7 @@
//Fetching a message if needed. src is the sender and C is the target client
/client/proc/cmd_admin_pm(whom, msg)
if(prefs.muted & MUTE_ADMINHELP)
src << "<font color='red'>Error: Admin-PM: You are unable to use admin PM-s (muted).</font>"
to_chat(src, "<font color='red'>Error: Admin-PM: You are unable to use admin PM-s (muted).</font>")
return
var/client/C
@@ -84,14 +84,14 @@
if(!msg)
return
if(holder)
src << "<font color='red'>Error: Use the admin IRC channel, nerd.</font>"
to_chat(src, "<font color='red'>Error: Use the admin IRC channel, nerd.</font>")
return
else
if(!C)
if(holder)
src << "<font color='red'>Error: Admin-PM: Client not found.</font>"
to_chat(src, "<font color='red'>Error: Admin-PM: Client not found.</font>")
else
adminhelp(msg) //admin we are replying to left. adminhelp instead
return
@@ -104,12 +104,12 @@
return
if(prefs.muted & MUTE_ADMINHELP)
src << "<font color='red'>Error: Admin-PM: You are unable to use admin PM-s (muted).</font>"
to_chat(src, "<font color='red'>Error: Admin-PM: You are unable to use admin PM-s (muted).</font>")
return
if(!C)
if(holder)
src << "<font color='red'>Error: Admin-PM: Client not found.</font>"
to_chat(src, "<font color='red'>Error: Admin-PM: Client not found.</font>")
else
adminhelp(msg) //admin we are replying to has vanished, adminhelp instead
return
@@ -131,18 +131,18 @@
var/keywordparsedmsg = keywords_lookup(msg)
if(irc)
src << "<font color='blue'>PM to-<b>Admins</b>: [rawmsg]</font>"
to_chat(src, "<font color='blue'>PM to-<b>Admins</b>: [rawmsg]</font>")
ircreplyamount--
send2irc("Reply: [ckey]",rawmsg)
else
if(C.holder)
if(holder) //both are admins
C << "<font color='red'>Admin PM from-<b>[key_name(src, C, 1)]</b>: [keywordparsedmsg]</font>"
src << "<font color='blue'>Admin PM to-<b>[key_name(C, src, 1)]</b>: [keywordparsedmsg]</font>"
to_chat(C, "<font color='red'>Admin PM from-<b>[key_name(src, C, 1)]</b>: [keywordparsedmsg]</font>")
to_chat(src, "<font color='blue'>Admin PM to-<b>[key_name(C, src, 1)]</b>: [keywordparsedmsg]</font>")
else //recipient is an admin but sender is not
C << "<font color='red'>Reply PM from-<b>[key_name(src, C, 1)]</b>: [keywordparsedmsg]</font>"
src << "<font color='blue'>PM to-<b>Admins</b>: [msg]</font>"
to_chat(C, "<font color='red'>Reply PM from-<b>[key_name(src, C, 1)]</b>: [keywordparsedmsg]</font>")
to_chat(src, "<font color='blue'>PM to-<b>Admins</b>: [msg]</font>")
//play the recieving admin the adminhelp sound (if they have them enabled)
if(C.prefs.toggles & SOUND_ADMINHELP)
@@ -150,10 +150,10 @@
else
if(holder) //sender is an admin but recipient is not. Do BIG RED TEXT
C << "<font color='red' size='4'><b>-- Administrator private message --</b></font>"
C << "<font color='red'>Admin PM from-<b>[key_name(src, C, 0)]</b>: [msg]</font>"
C << "<font color='red'><i>Click on the administrator's name to reply.</i></font>"
src << "<font color='blue'>Admin PM to-<b>[key_name(C, src, 1)]</b>: [msg]</font>"
to_chat(C, "<font color='red' size='4'><b>-- Administrator private message --</b></font>")
to_chat(C, "<font color='red'>Admin PM from-<b>[key_name(src, C, 0)]</b>: [msg]</font>")
to_chat(C, "<font color='red'><i>Click on the administrator's name to reply.</i></font>")
to_chat(src, "<font color='blue'>Admin PM to-<b>[key_name(C, src, 1)]</b>: [msg]</font>")
//always play non-admin recipients the adminhelp sound
C << 'sound/effects/adminhelp.ogg'
@@ -172,20 +172,20 @@
return
else //neither are admins
src << "<font color='red'>Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.</font>"
to_chat(src, "<font color='red'>Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.</font>")
return
if(irc)
log_admin_private("PM: [key_name(src)]->IRC: [rawmsg]")
for(var/client/X in admins)
X << "<B><font color='blue'>PM: [key_name(src, X, 0)]-&gt;IRC:</B> \blue [keywordparsedmsg]</font>" //inform X
to_chat(X, "<B><font color='blue'>PM: [key_name(src, X, 0)]-&gt;IRC:</B> \blue [keywordparsedmsg]</font>" )
else
window_flash(C, ignorepref = TRUE)
log_admin_private("PM: [key_name(src)]->[key_name(C)]: [rawmsg]")
//we don't use message_admins here because the sender/receiver might get it too
for(var/client/X in admins)
if(X.key!=key && X.key!=C.key) //check client/X is an admin and isn't the sender or recipient
X << "<B><font color='blue'>PM: [key_name(src, X, 0)]-&gt;[key_name(C, X, 0)]:</B> \blue [keywordparsedmsg]</font>" //inform X
to_chat(X, "<B><font color='blue'>PM: [key_name(src, X, 0)]-&gt;[key_name(C, X, 0)]:</B> \blue [keywordparsedmsg]</font>" )
@@ -211,9 +211,9 @@
log_admin_private("IRC PM: [sender] -> [key_name(C)] : [msg]")
msg = emoji_parse(msg)
C << "<font color='red' size='4'><b>-- Administrator private message --</b></font>"
C << "<font color='red'>Admin PM from-<b><a href='?priv_msg=[stealthkey]'>[adminname]</A></b>: [msg]</font>"
C << "<font color='red'><i>Click on the administrator's name to reply.</i></font>"
to_chat(C, "<font color='red' size='4'><b>-- Administrator private message --</b></font>")
to_chat(C, "<font color='red'>Admin PM from-<b><a href='?priv_msg=[stealthkey]'>[adminname]</A></b>: [msg]</font>")
to_chat(C, "<font color='red'><i>Click on the administrator's name to reply.</i></font>")
window_flash(C, ignorepref = TRUE)
//always play non-admin recipients the adminhelp sound
C << 'sound/effects/adminhelp.ogg'
+2 -2
View File
@@ -13,10 +13,10 @@
msg = keywords_lookup(msg)
if(check_rights(R_ADMIN,0))
msg = "<span class='admin'><span class='prefix'>ADMIN:</span> <EM>[key_name(usr, 1)]</EM> (<a href='?_src_=holder;adminplayerobservefollow=\ref[mob]'>FLW</A>): <span class='message'>[msg]</span></span>"
admins << msg
to_chat(admins, msg)
else
msg = "<span class='adminobserver'><span class='prefix'>ADMIN:</span> <EM>[key_name(usr, 1)]:</EM> <span class='message'>[msg]</span></span>"
admins << msg
to_chat(admins, msg)
feedback_add_details("admin_verb","M") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+7 -7
View File
@@ -2,30 +2,30 @@
set category = "Mapping"
set name = "Check Plumbing"
if(!src.holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
feedback_add_details("admin_verb","CP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
//all plumbing - yes, some things might get stated twice, doesn't matter.
for (var/obj/machinery/atmospherics/plumbing in machines)
if (plumbing.nodealert)
usr << "Unconnected [plumbing.name] located at [plumbing.x],[plumbing.y],[plumbing.z] ([get_area(plumbing.loc)])"
to_chat(usr, "Unconnected [plumbing.name] located at [plumbing.x],[plumbing.y],[plumbing.z] ([get_area(plumbing.loc)])")
//Manifolds
for (var/obj/machinery/atmospherics/pipe/manifold/pipe in machines)
if (!pipe.NODE1 || !pipe.NODE2 || !pipe.NODE3)
usr << "Unconnected [pipe.name] located at [pipe.x],[pipe.y],[pipe.z] ([get_area(pipe.loc)])"
to_chat(usr, "Unconnected [pipe.name] located at [pipe.x],[pipe.y],[pipe.z] ([get_area(pipe.loc)])")
//Pipes
for (var/obj/machinery/atmospherics/pipe/simple/pipe in machines)
if (!pipe.NODE1 || !pipe.NODE2)
usr << "Unconnected [pipe.name] located at [pipe.x],[pipe.y],[pipe.z] ([get_area(pipe.loc)])"
to_chat(usr, "Unconnected [pipe.name] located at [pipe.x],[pipe.y],[pipe.z] ([get_area(pipe.loc)])")
/client/proc/powerdebug()
set category = "Mapping"
set name = "Check Power"
if(!src.holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
feedback_add_details("admin_verb","CPOW") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -33,9 +33,9 @@
if (!PN.nodes || !PN.nodes.len)
if(PN.cables && (PN.cables.len > 1))
var/obj/structure/cable/C = PN.cables[1]
usr << "Powernet with no nodes! (number [PN.number]) - example cable at [C.x], [C.y], [C.z] in area [get_area(C.loc)]"
to_chat(usr, "Powernet with no nodes! (number [PN.number]) - example cable at [C.x], [C.y], [C.z] in area [get_area(C.loc)]")
if (!PN.cables || (PN.cables.len < 10))
if(PN.cables && (PN.cables.len > 1))
var/obj/structure/cable/C = PN.cables[1]
usr << "Powernet with fewer than 10 cables! (number [PN.number]) - example cable at [C.x], [C.y], [C.z] in area [get_area(C.loc)]"
to_chat(usr, "Powernet with fewer than 10 cables! (number [PN.number]) - example cable at [C.x], [C.y], [C.z] in area [get_area(C.loc)]")
+2 -2
View File
@@ -8,7 +8,7 @@
var/mob/living/target = M
if(!isliving(target))
usr << "This can only be used on instances of type /mob/living"
to_chat(usr, "This can only be used on instances of type /mob/living")
return
if(alert(usr, "Are you sure you wish to hit [key_name(target)] with Blue Space Artillery?", "Confirm Firing?" , "Yes" , "No") != "Yes")
@@ -23,7 +23,7 @@
else
T.break_tile()
target << "<span class='userdanger'>You're hit by bluespace artillery!</span>"
to_chat(target, "<span class='userdanger'>You're hit by bluespace artillery!</span>")
log_admin("[key_name(target)] has been hit by Bluespace Artillery fired by [key_name(usr)]")
message_admins("[ADMIN_LOOKUPFLW(target)] has been hit by Bluespace Artillery fired by [ADMIN_LOOKUPFLW(usr)]")
+39 -39
View File
@@ -116,45 +116,45 @@
/datum/buildmode/proc/show_help(mob/user)
switch(mode)
if(BASIC_BUILDMODE)
user << "\blue ***********************************************************"
user << "\blue Left Mouse Button = Construct / Upgrade"
user << "\blue Right Mouse Button = Deconstruct / Delete / Downgrade"
user << "\blue Left Mouse Button + ctrl = R-Window"
user << "\blue Left Mouse Button + alt = Airlock"
user << ""
user << "\blue Use the button in the upper left corner to"
user << "\blue change the direction of built objects."
user << "\blue ***********************************************************"
to_chat(user, "\blue ***********************************************************")
to_chat(user, "\blue Left Mouse Button = Construct / Upgrade")
to_chat(user, "\blue Right Mouse Button = Deconstruct / Delete / Downgrade")
to_chat(user, "\blue Left Mouse Button + ctrl = R-Window")
to_chat(user, "\blue Left Mouse Button + alt = Airlock")
to_chat(user, "")
to_chat(user, "\blue Use the button in the upper left corner to")
to_chat(user, "\blue change the direction of built objects.")
to_chat(user, "\blue ***********************************************************")
if(ADV_BUILDMODE)
user << "\blue ***********************************************************"
user << "\blue Right Mouse Button on buildmode button = Set object type"
user << "\blue Left Mouse Button on turf/obj = Place objects"
user << "\blue Right Mouse Button = Delete objects"
user << ""
user << "\blue Use the button in the upper left corner to"
user << "\blue change the direction of built objects."
user << "\blue ***********************************************************"
to_chat(user, "\blue ***********************************************************")
to_chat(user, "\blue Right Mouse Button on buildmode button = Set object type")
to_chat(user, "\blue Left Mouse Button on turf/obj = Place objects")
to_chat(user, "\blue Right Mouse Button = Delete objects")
to_chat(user, "")
to_chat(user, "\blue Use the button in the upper left corner to")
to_chat(user, "\blue change the direction of built objects.")
to_chat(user, "\blue ***********************************************************")
if(VAR_BUILDMODE)
user << "\blue ***********************************************************"
user << "\blue Right Mouse Button on buildmode button = Select var(type) & value"
user << "\blue Left Mouse Button on turf/obj/mob = Set var(type) & value"
user << "\blue Right Mouse Button on turf/obj/mob = Reset var's value"
user << "\blue ***********************************************************"
to_chat(user, "\blue ***********************************************************")
to_chat(user, "\blue Right Mouse Button on buildmode button = Select var(type) & value")
to_chat(user, "\blue Left Mouse Button on turf/obj/mob = Set var(type) & value")
to_chat(user, "\blue Right Mouse Button on turf/obj/mob = Reset var's value")
to_chat(user, "\blue ***********************************************************")
if(THROW_BUILDMODE)
user << "\blue ***********************************************************"
user << "\blue Left Mouse Button on turf/obj/mob = Select"
user << "\blue Right Mouse Button on turf/obj/mob = Throw"
user << "\blue ***********************************************************"
to_chat(user, "\blue ***********************************************************")
to_chat(user, "\blue Left Mouse Button on turf/obj/mob = Select")
to_chat(user, "\blue Right Mouse Button on turf/obj/mob = Throw")
to_chat(user, "\blue ***********************************************************")
if(AREA_BUILDMODE)
user << "\blue ***********************************************************"
user << "\blue Left Mouse Button on turf/obj/mob = Select corner"
user << "\blue Right Mouse Button on buildmode button = Select generator"
user << "\blue ***********************************************************"
to_chat(user, "\blue ***********************************************************")
to_chat(user, "\blue Left Mouse Button on turf/obj/mob = Select corner")
to_chat(user, "\blue Right Mouse Button on buildmode button = Select generator")
to_chat(user, "\blue ***********************************************************")
if(COPY_BUILDMODE)
user << "\blue ***********************************************************"
user << "\blue Left Mouse Button on obj/turf/mob = Spawn a Copy of selected target"
user << "\blue Right Mouse Button on obj/mob = Select target to copy"
user << "\blue ***********************************************************"
to_chat(user, "\blue ***********************************************************")
to_chat(user, "\blue Left Mouse Button on obj/turf/mob = Spawn a Copy of selected target")
to_chat(user, "\blue Right Mouse Button on obj/mob = Select target to copy")
to_chat(user, "\blue ***********************************************************")
/datum/buildmode/proc/change_settings(mob/user)
switch(mode)
@@ -284,7 +284,7 @@
var/obj/structure/window/reinforced/WIN = new/obj/structure/window/reinforced(get_turf(object))
WIN.setDir(WEST)
if(NORTHWEST)
var/obj/structure/window/reinforced/WIN = new/obj/structure/window/reinforced(get_turf(object))
var/obj/structure/window/reinforced/WIN = new/obj/structure/window/reinforced/fulltile(get_turf(object))
WIN.setDir(NORTHWEST)
log_admin("Build Mode: [key_name(user)] built a window at ([object.x],[object.y],[object.z])")
if(ADV_BUILDMODE)
@@ -308,13 +308,13 @@
log_admin("Build Mode: [key_name(user)] modified [object.name]'s [varholder] to [valueholder]")
object.vars[varholder] = valueholder
else
user << "<span class='warning'>[initial(object.name)] does not have a var called '[varholder]'</span>"
to_chat(user, "<span class='warning'>[initial(object.name)] does not have a var called '[varholder]'</span>")
if(right_click)
if(object.vars.Find(varholder))
log_admin("Build Mode: [key_name(user)] modified [object.name]'s [varholder] to [valueholder]")
object.vars[varholder] = initial(object.vars[varholder])
else
user << "<span class='warning'>[initial(object.name)] does not have a var called '[varholder]'</span>"
to_chat(user, "<span class='warning'>[initial(object.name)] does not have a var called '[varholder]'</span>")
if(THROW_BUILDMODE)
if(left_click)
@@ -335,7 +335,7 @@
if(left_click) //rectangular
if(cornerA && cornerB)
if(!generator_path)
user << "<span class='warning'>Select generator type first.</span>"
to_chat(user, "<span class='warning'>Select generator type first.</span>")
var/datum/mapGenerator/G = new generator_path
G.defineRegion(cornerA,cornerB,1)
G.generate()
@@ -352,4 +352,4 @@
DuplicateObject(stored,perfectcopy=1,newloc=T)
else if(right_click)
if(ismovableatom(object)) // No copying turfs for now.
stored = object
stored = object
+2 -2
View File
@@ -3,12 +3,12 @@
set name = "Dsay" //Gave this shit a shorter name so you only have to time out "dsay" rather than "dead say" to use it --NeoFite
set hidden = 1
if(!src.holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
if(!src.mob)
return
if(prefs.muted & MUTE_DEADCHAT)
src << "<span class='danger'>You cannot send DSAY messages (muted).</span>"
to_chat(src, "<span class='danger'>You cannot send DSAY messages (muted).</span>")
return
if (src.handle_spam_prevention(msg,MUTE_DEADCHAT))
+45 -32
View File
@@ -53,12 +53,12 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
return
if(targetselected && !hascall(target,procname))
usr << "<font color='red'>Error: callproc(): type [target.type] has no proc named [procname].</font>"
to_chat(usr, "<font color='red'>Error: callproc(): type [target.type] has no proc named [procname].</font>")
return
else
var/procpath = text2path(procname)
if (!procpath)
usr << "<font color='red'>Error: callproc(): proc [procname] does not exist. (Did you forget the /proc/ part?)</font>"
to_chat(usr, "<font color='red'>Error: callproc(): proc [procname] does not exist. (Did you forget the /proc/ part?)</font>")
return
var/list/lst = get_callproc_args()
if(!lst)
@@ -66,7 +66,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(targetselected)
if(!target)
usr << "<font color='red'>Error: callproc(): owner of proc no longer exists.</font>"
to_chat(usr, "<font color='red'>Error: callproc(): owner of proc no longer exists.</font>")
return
log_admin("[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
message_admins("[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
@@ -78,7 +78,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
returnval = call(procname)(arglist(lst)) // Pass the lst as an argument list to the proc
. = get_callproc_returnval(returnval, procname)
if(.)
usr << .
to_chat(usr, .)
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(datum/A as null|area|mob|obj|turf)
@@ -93,14 +93,14 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(!procname)
return
if(!hascall(A,procname))
usr << "<font color='red'>Error: callproc_datum(): type [A.type] has no proc named [procname].</font>"
to_chat(usr, "<font color='red'>Error: callproc_datum(): type [A.type] has no proc named [procname].</font>")
return
var/list/lst = get_callproc_args()
if(!lst)
return
if(!A || !IsValidSrc(A))
usr << "<span class='warning'>Error: callproc_datum(): owner of proc no longer exists.</span>"
to_chat(usr, "<span class='warning'>Error: callproc_datum(): owner of proc no longer exists.</span>")
return
log_admin("[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
message_admins("[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
@@ -109,7 +109,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
var/returnval = call(A,procname)(arglist(lst)) // Pass the lst as an argument list to the proc
. = get_callproc_returnval(returnval,procname)
if(.)
usr << .
to_chat(usr, .)
@@ -174,7 +174,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(id in hardcoded_gases || env_gases[id][MOLES])
t+= "[env_gases[id][GAS_META][META_GAS_NAME]] : [env_gases[id][MOLES]]\n"
usr << t
to_chat(usr, t)
feedback_add_details("admin_verb","ASL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_robotize(mob/M in mob_list)
@@ -507,33 +507,33 @@ var/list/TYPES_SHORTCUTS = list(
var/list/areas_without_intercom = areas_all - areas_with_intercom
var/list/areas_without_camera = areas_all - areas_with_camera
world << "<b>AREAS WITHOUT AN APC:</b>"
to_chat(world, "<b>AREAS WITHOUT AN APC:</b>")
for(var/areatype in areas_without_APC)
world << "* [areatype]"
to_chat(world, "* [areatype]")
world << "<b>AREAS WITHOUT AN AIR ALARM:</b>"
to_chat(world, "<b>AREAS WITHOUT AN AIR ALARM:</b>")
for(var/areatype in areas_without_air_alarm)
world << "* [areatype]"
to_chat(world, "* [areatype]")
world << "<b>AREAS WITHOUT A REQUEST CONSOLE:</b>"
to_chat(world, "<b>AREAS WITHOUT A REQUEST CONSOLE:</b>")
for(var/areatype in areas_without_RC)
world << "* [areatype]"
to_chat(world, "* [areatype]")
world << "<b>AREAS WITHOUT ANY LIGHTS:</b>"
to_chat(world, "<b>AREAS WITHOUT ANY LIGHTS:</b>")
for(var/areatype in areas_without_light)
world << "* [areatype]"
to_chat(world, "* [areatype]")
world << "<b>AREAS WITHOUT A LIGHT SWITCH:</b>"
to_chat(world, "<b>AREAS WITHOUT A LIGHT SWITCH:</b>")
for(var/areatype in areas_without_LS)
world << "* [areatype]"
to_chat(world, "* [areatype]")
world << "<b>AREAS WITHOUT ANY INTERCOMS:</b>"
to_chat(world, "<b>AREAS WITHOUT ANY INTERCOMS:</b>")
for(var/areatype in areas_without_intercom)
world << "* [areatype]"
to_chat(world, "* [areatype]")
world << "<b>AREAS WITHOUT ANY CAMERAS:</b>"
to_chat(world, "<b>AREAS WITHOUT ANY CAMERAS:</b>")
for(var/areatype in areas_without_camera)
world << "* [areatype]"
to_chat(world, "* [areatype]")
/client/proc/cmd_admin_dress(mob/living/carbon/human/M in mob_list)
set category = "Fun"
@@ -663,19 +663,19 @@ var/list/TYPES_SHORTCUTS = list(
switch(input("Which list?") in list("Players","Admins","Mobs","Living Mobs","Dead Mobs","Clients","Joined Clients"))
if("Players")
usr << jointext(player_list,",")
to_chat(usr, jointext(player_list,","))
if("Admins")
usr << jointext(admins,",")
to_chat(usr, jointext(admins,","))
if("Mobs")
usr << jointext(mob_list,",")
to_chat(usr, jointext(mob_list,","))
if("Living Mobs")
usr << jointext(living_mob_list,",")
to_chat(usr, jointext(living_mob_list,","))
if("Dead Mobs")
usr << jointext(dead_mob_list,",")
to_chat(usr, jointext(dead_mob_list,","))
if("Clients")
usr << jointext(clients,",")
to_chat(usr, jointext(clients,","))
if("Joined Clients")
usr << jointext(joined_player_list,",")
to_chat(usr, jointext(joined_player_list,","))
/client/proc/cmd_display_del_log()
set category = "Debug"
@@ -734,8 +734,8 @@ var/list/TYPES_SHORTCUTS = list(
if(istype(landmark))
var/datum/map_template/ruin/template = landmark.ruin_template
usr.forceMove(get_turf(landmark))
usr << "<span class='name'>[template.name]</span>"
usr << "<span class='italics'>[template.description]</span>"
to_chat(usr, "<span class='name'>[template.name]</span>")
to_chat(usr, "<span class='italics'>[template.description]</span>")
/client/proc/clear_dynamic_transit()
set category = "Debug"
@@ -771,4 +771,17 @@ var/list/TYPES_SHORTCUTS = list(
if(!holder)
return
error_cache.show_to(src)
error_cache.show_to(src)
/client/proc/pump_random_event()
set category = "Debug"
set name = "Pump Random Event"
set desc = "Schedules the event subsystem to fire a new random event immediately. Some events may fire without notification."
if(!holder)
return
SSevent.scheduled = world.time
message_admins("<span class='adminnotice'>[key_name_admin(src)] pumped a random event.</span>")
feedback_add_details("admin_verb","PRE")
log_admin("[key_name(src)] pumped a random event.")
+2 -2
View File
@@ -13,9 +13,9 @@
if(T.active_hotspot)
burning = 1
usr << "<span class='adminnotice'>@[target.x],[target.y]: [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(burning)?("\red BURNING"):(null)]</span>"
to_chat(usr, "<span class='adminnotice'>@[target.x],[target.y]: [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(burning)?("\red BURNING"):(null)]</span>")
for(var/id in GM_gases)
usr << "[GM_gases[id][GAS_META][META_GAS_NAME]]: [GM_gases[id][MOLES]]"
to_chat(usr, "[GM_gases[id][GAS_META][META_GAS_NAME]]: [GM_gases[id][MOLES]]")
feedback_add_details("admin_verb","DAST") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/fix_next_move()
+1 -1
View File
@@ -10,7 +10,7 @@
var/new_fps = round(input("Sets game frames-per-second. Can potentially break the game (default: [config.fps])","FPS", world.fps) as num|null)
if(new_fps <= 0)
src << "<span class='danger'>Error: set_server_fps(): Invalid world.fps value. No changes made.</span>"
to_chat(src, "<span class='danger'>Error: set_server_fps(): Invalid world.fps value. No changes made.</span>")
return
if(new_fps > config.fps*1.5)
if(alert(src, "You are setting fps to a high value:\n\t[new_fps] frames-per-second\n\tconfig.fps = [config.fps]","Warning!","Confirm","ABORT-ABORT-ABORT") != "Confirm")
+9 -9
View File
@@ -24,16 +24,16 @@
set category = null
if(!src.holder)
src << "<font color='red'>Only Admins may use this command.</font>"
to_chat(src, "<font color='red'>Only Admins may use this command.</font>")
return
var/client/target = input(src,"Choose somebody to grant access to the server's runtime logs (permissions expire at the end of each round):","Grant Permissions",null) as null|anything in clients
if(!istype(target,/client))
src << "<font color='red'>Error: giveruntimelog(): Client not found.</font>"
to_chat(src, "<font color='red'>Error: giveruntimelog(): Client not found.</font>")
return
target.verbs |= /client/proc/getruntimelog
target << "<font color='red'>You have been granted access to runtime logs. Please use them responsibly or risk being banned.</font>"
to_chat(target, "<font color='red'>You have been granted access to runtime logs. Please use them responsibly or risk being banned.</font>")
return
@@ -52,8 +52,8 @@
return
message_admins("[key_name_admin(src)] accessed file: [path]")
src << ftp( file(path) )
src << "Attempting to send file, this may take a fair few minutes if the file is very large."
src << ftp(file(path))
to_chat(src, "Attempting to send file, this may take a fair few minutes if the file is very large.")
return
@@ -72,8 +72,8 @@
return
message_admins("[key_name_admin(src)] accessed file: [path]")
src << ftp( file(path) )
src << "Attempting to send file, this may take a fair few minutes if the file is very large."
src << ftp(file(path))
to_chat(src, "Attempting to send file, this may take a fair few minutes if the file is very large.")
return
@@ -88,7 +88,7 @@
if(fexists("[diary]"))
src << ftp(diary)
else
src << "<font color='red'>Server log not found, try using .getserverlog.</font>"
to_chat(src, "<font color='red'>Server log not found, try using .getserverlog.</font>")
return
feedback_add_details("admin_verb","VTL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
@@ -102,7 +102,7 @@
if(fexists("[diaryofmeanpeople]"))
src << ftp(diaryofmeanpeople)
else
src << "<font color='red'>Server attack log not found, try using .getserverlog.</font>"
to_chat(src, "<font color='red'>Server attack log not found, try using .getserverlog.</font>")
return
feedback_add_details("admin_verb","SSAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
@@ -0,0 +1,27 @@
/proc/show_individual_logging_panel(mob/M, type = INDIVIDUAL_ATTACK_LOG)
if(!M || !ismob(M))
return
var/dat = "<center><a href='?_src_=holder;individuallog=\ref[M];log_type=[INDIVIDUAL_ATTACK_LOG]'>Attack log</a> | "
dat += "<a href='?_src_=holder;individuallog=\ref[M];log_type=[INDIVIDUAL_SAY_LOG]'>Say log</a> | "
dat += "<a href='?_src_=holder;individuallog=\ref[M];log_type=[INDIVIDUAL_EMOTE_LOG]'>Emote log</a> | "
dat += "<a href='?_src_=holder;individuallog=\ref[M];log_type=[INDIVIDUAL_OOC_LOG]'>OOC log</a> | "
dat += "<a href='?_src_=holder;individuallog=\ref[M];log_type=[INDIVIDUAL_SHOW_ALL_LOG]'>Show all</a> | "
dat += "<a href='?_src_=holder;individuallog=\ref[M];log_type=[type]'>Refresh</a></center>"
dat += "<hr style='background:#000000; border:0; height:1px'>"
if(type == INDIVIDUAL_SHOW_ALL_LOG)
dat += "<center>Displaying all logs of [key_name(M)]</center><br><hr>"
for(var/log_type in M.logging)
dat += "<center>[log_type]</center><br>"
for(var/entry in M.logging[log_type])
dat += "<font size=2px>[entry]: [M.logging[log_type][entry]]</font><br>"
dat += "<hr>"
else
dat += "<center>[type] of [key_name(M)]</center><br>"
for(var/entry in M.logging[type])
dat += "<font size=2px>[entry]: [M.logging[type][entry]]</font><hr>"
usr << browse(dat, "window=invidual_logging;size=600x480")
@@ -21,7 +21,7 @@
if(template.load(T, centered = TRUE))
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has placed a map template ([template.name]) at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>(JMP)</a></span>")
else
usr << "Failed to place map"
to_chat(usr, "Failed to place map")
usr.client.images -= preview
/client/proc/map_template_upload()
@@ -32,13 +32,13 @@
if(!map)
return
if(copytext("[map]",-4) != ".dmm")
usr << "Bad map file: [map]"
to_chat(usr, "Bad map file: [map]")
return
var/datum/map_template/M = new(map, "[map]")
if(M.preload_size(map))
usr << "Map template '[map]' ready to place ([M.width]x[M.height])"
to_chat(usr, "Map template '[map]' ready to place ([M.width]x[M.height])")
SSmapping.map_templates[M.name] = M
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has uploaded a map template ([map])</span>")
else
usr << "Map template '[map]' failed to load properly"
to_chat(usr, "Map template '[map]' failed to load properly")
+4 -4
View File
@@ -215,9 +215,9 @@ var/list/admin_verbs_debug_mapping = list(
if(i*10+j <= atom_list.len)
temp_atom = atom_list[i*10+j]
line += " no.[i+10+j]@\[[temp_atom.x], [temp_atom.y], [temp_atom.z]\]; "
world << line*/
to_chat(world, line)*/
world << "There are [count] objects of type [type_path] on z-level [num_level]"
to_chat(world, "There are [count] objects of type [type_path] on z-level [num_level]")
feedback_add_details("admin_verb","mOBJZ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/count_objects_all()
@@ -242,9 +242,9 @@ var/list/admin_verbs_debug_mapping = list(
if(i*10+j <= atom_list.len)
temp_atom = atom_list[i*10+j]
line += " no.[i+10+j]@\[[temp_atom.x], [temp_atom.y], [temp_atom.z]\]; "
world << line*/
to_chat(world, line)*/
world << "There are [count] objects of type [type_path] in the game world"
to_chat(world, "There are [count] objects of type [type_path] in the game world")
feedback_add_details("admin_verb","mOBJ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+13 -13
View File
@@ -7,27 +7,27 @@
message_admins("[key_name_admin(usr)] is forcing a random map rotation.")
log_admin("[key_name(usr)] is forcing a random map rotation.")
ticker.maprotatechecked = 1
maprotate()
SSmapping.maprotate()
/client/proc/adminchangemap()
set category = "Server"
set name = "Change Map"
var/list/maprotatechoices = list()
for (var/map in config.maplist)
var/datum/votablemap/VM = config.maplist[map]
var/mapname = VM.friendlyname
var/datum/map_config/VM = config.maplist[map]
var/mapname = VM.map_name
if (VM == config.defaultmap)
mapname += " (Default)"
if (VM.minusers > 0 || VM.maxusers > 0)
if (VM.config_min_users > 0 || VM.config_max_users > 0)
mapname += " \["
if (VM.minusers > 0)
mapname += "[VM.minusers]"
if (VM.config_min_users > 0)
mapname += "[VM.config_min_users]"
else
mapname += "0"
mapname += "-"
if (VM.maxusers > 0)
mapname += "[VM.maxusers]"
if (VM.config_max_users > 0)
mapname += "[VM.config_max_users]"
else
mapname += "inf"
mapname += "\]"
@@ -37,8 +37,8 @@
if (!chosenmap)
return
ticker.maprotatechecked = 1
var/datum/votablemap/VM = maprotatechoices[chosenmap]
message_admins("[key_name_admin(usr)] is changing the map to [VM.name]([VM.friendlyname])")
log_admin("[key_name(usr)] is changing the map to [VM.name]([VM.friendlyname])")
if (changemap(VM) == 0)
message_admins("[key_name_admin(usr)] has changed the map to [VM.name]([VM.friendlyname])")
var/datum/map_config/VM = maprotatechoices[chosenmap]
message_admins("[key_name_admin(usr)] is changing the map to [VM.map_name]")
log_admin("[key_name(usr)] is changing the map to [VM.map_name]")
if (SSmapping.changemap(VM) == 0)
message_admins("[key_name_admin(usr)] has changed the map to [VM.map_name]")
+16 -16
View File
@@ -38,7 +38,7 @@
var/var_value = O.vars[variable]
if(variable in VVckey_edit)
src << "It's forbidden to mass-modify ckeys. It'll crash everyone's client you dummy."
to_chat(src, "It's forbidden to mass-modify ckeys. It'll crash everyone's client you dummy.")
return
if(variable in VVlocked)
if(!check_rights(R_DEBUG))
@@ -56,11 +56,11 @@
default = vv_get_class(var_value)
if(isnull(default))
src << "Unable to determine variable type."
to_chat(src, "Unable to determine variable type.")
else
src << "Variable appears to be <b>[uppertext(default)]</b>."
to_chat(src, "Variable appears to be <b>[uppertext(default)]</b>.")
src << "Variable contains: [var_value]"
to_chat(src, "Variable contains: [var_value]")
if(default == VV_NUM)
var/dir_text = ""
@@ -75,7 +75,7 @@
dir_text += "WEST"
if(dir_text)
src << "If a direction, direction is: [dir_text]"
to_chat(src, "If a direction, direction is: [dir_text]")
var/value = vv_get_value(default_class = default)
var/new_value = value["value"]
@@ -97,9 +97,9 @@
switch(class)
if(VV_RESTORE_DEFAULT)
src << "Finding items..."
to_chat(src, "Finding items...")
var/list/items = get_all_of_type(O.type, method)
src << "Changing [items.len] items..."
to_chat(src, "Changing [items.len] items...")
for(var/thing in items)
if (!thing)
continue
@@ -123,9 +123,9 @@
for(var/V in varsvars)
new_value = replacetext(new_value,"\[[V]]","[O.vars[V]]")
src << "Finding items..."
to_chat(src, "Finding items...")
var/list/items = get_all_of_type(O.type, method)
src << "Changing [items.len] items..."
to_chat(src, "Changing [items.len] items...")
for(var/thing in items)
if (!thing)
continue
@@ -151,9 +151,9 @@
many = FALSE
var/type = value["type"]
src << "Finding items..."
to_chat(src, "Finding items...")
var/list/items = get_all_of_type(O.type, method)
src << "Changing [items.len] items..."
to_chat(src, "Changing [items.len] items...")
for(var/thing in items)
if (!thing)
continue
@@ -169,9 +169,9 @@
CHECK_TICK
else
src << "Finding items..."
to_chat(src, "Finding items...")
var/list/items = get_all_of_type(O.type, method)
src << "Changing [items.len] items..."
to_chat(src, "Changing [items.len] items...")
for(var/thing in items)
if (!thing)
continue
@@ -185,13 +185,13 @@
var/count = rejected+accepted
if (!count)
src << "No objects found"
to_chat(src, "No objects found")
return
if (!accepted)
src << "Every object rejected your edit"
to_chat(src, "Every object rejected your edit")
return
if (rejected)
src << "[rejected] out of [count] objects rejected your edit"
to_chat(src, "[rejected] out of [count] objects rejected your edit")
log_world("### MassVarEdit by [src]: [O.type] (A/R [accepted]/[rejected]) [variable]=[html_encode("[O.vars[variable]]")]([list2params(value)])")
log_admin("[key_name(src)] mass modified [original_name]'s [variable] to [O.vars[variable]] ([accepted] objects modified)")
+16 -16
View File
@@ -335,7 +335,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "bound_height", "bound_width
L[var_value] = mod_list_add_ass(O) //hehe
if (O)
if (O.vv_edit_var(objectvar, L) == FALSE)
src << "Your edit was rejected by the object."
to_chat(src, "Your edit was rejected by the object.")
return
log_world("### ListVarEdit by [src]: [(O ? O.type : "/list")] [objectvar]: ADDED=[var_value]")
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: ADDED=[var_value]")
@@ -345,7 +345,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "bound_height", "bound_width
if(!check_rights(R_VAREDIT))
return
if(!istype(L, /list))
src << "Not a List."
to_chat(src, "Not a List.")
return
if(L.len > 1000)
@@ -378,7 +378,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "bound_height", "bound_width
L = L.Copy()
listclearnulls(L)
if (!O.vv_edit_var(objectvar, L))
src << "Your edit was rejected by the object."
to_chat(src, "Your edit was rejected by the object.")
return
log_world("### ListVarEdit by [src]: [O.type] [objectvar]: CLEAR NULLS")
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: CLEAR NULLS")
@@ -388,7 +388,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "bound_height", "bound_width
if(variable == "(CLEAR DUPES)")
L = uniqueList(L)
if (!O.vv_edit_var(objectvar, L))
src << "Your edit was rejected by the object."
to_chat(src, "Your edit was rejected by the object.")
return
log_world("### ListVarEdit by [src]: [O.type] [objectvar]: CLEAR DUPES")
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: CLEAR DUPES")
@@ -398,7 +398,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "bound_height", "bound_width
if(variable == "(SHUFFLE)")
L = shuffle(L)
if (!O.vv_edit_var(objectvar, L))
src << "Your edit was rejected by the object."
to_chat(src, "Your edit was rejected by the object.")
return
log_world("### ListVarEdit by [src]: [O.type] [objectvar]: SHUFFLE")
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: SHUFFLE")
@@ -427,9 +427,9 @@ var/list/VVpixelmovement = list("step_x", "step_y", "bound_height", "bound_width
default = vv_get_class(variable)
src << "Variable appears to be <b>[uppertext(default)]</b>."
to_chat(src, "Variable appears to be <b>[uppertext(default)]</b>.")
src << "Variable contains: [L[index]]"
to_chat(src, "Variable contains: [L[index]]")
if(default == VV_NUM)
var/dir_text = ""
@@ -444,7 +444,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "bound_height", "bound_width
dir_text += "WEST"
if(dir_text)
usr << "If a direction, direction is: [dir_text]"
to_chat(usr, "If a direction, direction is: [dir_text]")
var/original_var
if(assoc)
@@ -475,7 +475,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "bound_height", "bound_width
L.Cut(index, index+1)
if (O)
if (O.vv_edit_var(objectvar, L))
src << "Your edit was rejected by the object."
to_chat(src, "Your edit was rejected by the object.")
return
log_world("### ListVarEdit by [src]: [O.type] [objectvar]: REMOVED=[html_encode("[original_var]")]")
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: REMOVED=[original_var]")
@@ -494,7 +494,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "bound_height", "bound_width
L[index] = new_var
if (O)
if (O.vv_edit_var(objectvar, L) == FALSE)
src << "Your edit was rejected by the object."
to_chat(src, "Your edit was rejected by the object.")
return
log_world("### ListVarEdit by [src]: [(O ? O.type : "/list")] [objectvar]: [original_var]=[new_var]")
log_admin("[key_name(src)] modified [original_name]'s [objectvar]: [original_var]=[new_var]")
@@ -510,7 +510,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "bound_height", "bound_width
if(param_var_name)
if(!param_var_name in O.vars)
src << "A variable with this name ([param_var_name]) doesn't exist in this datum ([O])"
to_chat(src, "A variable with this name ([param_var_name]) doesn't exist in this datum ([O])")
return
variable = param_var_name
@@ -547,11 +547,11 @@ var/list/VVpixelmovement = list("step_x", "step_y", "bound_height", "bound_width
var/default = vv_get_class(var_value)
if(isnull(default))
src << "Unable to determine variable type."
to_chat(src, "Unable to determine variable type.")
else
src << "Variable appears to be <b>[uppertext(default)]</b>."
to_chat(src, "Variable appears to be <b>[uppertext(default)]</b>.")
src << "Variable contains: [var_value]"
to_chat(src, "Variable contains: [var_value]")
if(default == VV_NUM)
var/dir_text = ""
@@ -566,7 +566,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "bound_height", "bound_width
dir_text += "WEST"
if(dir_text)
src << "If a direction, direction is: [dir_text]"
to_chat(src, "If a direction, direction is: [dir_text]")
if(autodetect_class && default != VV_NULL)
if (default == VV_TEXT)
@@ -603,7 +603,7 @@ var/list/VVpixelmovement = list("step_x", "step_y", "bound_height", "bound_width
if (O.vv_edit_var(variable, var_new) == FALSE)
src << "Your edit was rejected by the object."
to_chat(src, "Your edit was rejected by the object.")
return
log_world("### VarEdit by [src]: [O.type] [variable]=[html_encode("[O.vars[variable]]")]")
log_admin("[key_name(src)] modified [original_name]'s [variable] to [O.vars[variable]]")
+8 -8
View File
@@ -199,9 +199,9 @@
for(var/i = 0, i<numCultists, i++)
H = pick(candidates)
H << "<span class='heavy_brass'>The world before you suddenly glows a brilliant yellow. You hear the whooshing steam and clanking cogs of a billion billion machines, and all at once \
to_chat(H, "<span class='heavy_brass'>The world before you suddenly glows a brilliant yellow. You hear the whooshing steam and clanking cogs of a billion billion machines, and all at once \
you see the truth. Ratvar, the Clockwork Justiciar, lies derelict and forgotten in an unseen realm, and he has selected you as one of his harbringers. You are now a servant of \
Ratvar, and you will bring him back.</span>"
Ratvar, and you will bring him back.</span>")
add_servant_of_ratvar(H, TRUE)
ticker.mode.equip_servant(H)
candidates.Remove(H)
@@ -331,14 +331,14 @@
Commando.mind.objectives += missionobj
//Greet the commando
Commando << "<B><font size=3 color=red>You are the [numagents==1?"Deathsquad Officer":"Death Commando"].</font></B>"
to_chat(Commando, "<B><font size=3 color=red>You are the [numagents==1?"Deathsquad Officer":"Death Commando"].</font></B>")
var/missiondesc = "Your squad is being sent on a mission to [station_name()] by Nanotrasen's Security Division."
if(numagents == 1) //If Squad Leader
missiondesc += " Lead your squad to ensure the completion of the mission. Board the shuttle when your team is ready."
else
missiondesc += " Follow orders given to you by your squad leader."
missiondesc += "<BR><B>Your Mission</B>: [mission]"
Commando << missiondesc
to_chat(Commando, missiondesc)
if(config.enforce_human_authority)
Commando.set_species(/datum/species/human)
@@ -423,8 +423,8 @@
newmob.set_species(/datum/species/human)
//Greet the official
newmob << "<B><font size=3 color=red>You are a Centcom Official.</font></B>"
newmob << "<BR>Central Command is sending you to [station_name()] with the task: [mission]"
to_chat(newmob, "<B><font size=3 color=red>You are a Centcom Official.</font></B>")
to_chat(newmob, "<BR>Central Command is sending you to [station_name()] with the task: [mission]")
//Logging and cleanup
message_admins("Centcom Official [key_name_admin(newmob)] has spawned with the task: [mission]")
@@ -520,14 +520,14 @@
ERTOperative.mind.objectives += missionobj
//Greet the commando
ERTOperative << "<B><font size=3 color=red>You are [numagents==1?"the Emergency Response Team Commander":"an Emergency Response Officer"].</font></B>"
to_chat(ERTOperative, "<B><font size=3 color=red>You are [numagents==1?"the Emergency Response Team Commander":"an Emergency Response Officer"].</font></B>")
var/missiondesc = "Your squad is being sent on a Code [alert] mission to [station_name()] by Nanotrasen's Security Division."
if(numagents == 1) //If Squad Leader
missiondesc += " Lead your squad to ensure the completion of the mission. Avoid civilian casualites when possible. Board the shuttle when your team is ready."
else
missiondesc += " Follow orders given to you by your commander. Avoid civilian casualites when possible."
missiondesc += "<BR><B>Your Mission</B>: [mission]"
ERTOperative << missiondesc
to_chat(ERTOperative, missiondesc)
if(config.enforce_human_authority)
ERTOperative.set_species(/datum/species/human)
+3 -3
View File
@@ -75,8 +75,8 @@ var/highlander = FALSE
antiwelder.icon_state = "bloodhand_right"
put_in_hands(antiwelder)
src << "<span class='boldannounce'>Your [H1.name] cries out for blood. Claim the lives of others, and your own will be restored!\n\
Activate it in your hand, and it will lead to the nearest target. Attack the nuclear authentication disk with it, and you will store it.</span>"
to_chat(src, "<span class='boldannounce'>Your [H1.name] cries out for blood. Claim the lives of others, and your own will be restored!\n\
Activate it in your hand, and it will lead to the nearest target. Attack the nuclear authentication disk with it, and you will store it.</span>")
/proc/only_me()
if(!ticker || !ticker.mode)
@@ -94,7 +94,7 @@ var/highlander = FALSE
hijack_objective.owner = H.mind
H.mind.objectives += hijack_objective
H << "<B>You are the multiverse summoner. Activate your blade to summon copies of yourself from another universe to fight by your side.</B>"
to_chat(H, "<B>You are the multiverse summoner. Activate your blade to summon copies of yourself from another universe to fight by your side.</B>")
H.mind.announce_objectives()
var/datum/gang/multiverse/G = new(src, "[H.real_name]")
+1 -1
View File
@@ -2,7 +2,7 @@
set category = "Server"
set name = "Toggle Panic Bunker"
if (!config.sql_enabled)
usr << "<span class='adminnotice'>The Database is not enabled!</span>"
to_chat(usr, "<span class='adminnotice'>The Database is not enabled!</span>")
return
config.panic_bunker = (!config.panic_bunker)
+3 -3
View File
@@ -13,7 +13,7 @@ var/sound/admin_sound
var/freq = 1
if(SSevent.holidays && SSevent.holidays[APRIL_FOOLS])
freq = pick(0.5, 0.7, 0.8, 0.85, 0.9, 0.95, 1.1, 1.2, 1.4, 1.6, 2.0, 2.5)
src << "You feel the Honkmother messing with your song..."
to_chat(src, "You feel the Honkmother messing with your song...")
var/sound/admin_sound = new()
admin_sound.file = S
@@ -23,11 +23,11 @@ var/sound/admin_sound
admin_sound.wait = 1
admin_sound.repeat = 0
admin_sound.status = SOUND_STREAM
for(var/mob/M in player_list)
if(M.client.prefs.toggles & SOUND_MIDI)
M << admin_sound
feedback_add_details("admin_verb","PGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+1 -1
View File
@@ -4,7 +4,7 @@
if(istype(O,/obj/singularity))
if(config.forbid_singulo_possession)
usr << "It is forbidden to possess singularities."
to_chat(usr, "It is forbidden to possess singularities.")
return
var/turf/T = get_turf(O)
+7 -7
View File
@@ -3,7 +3,7 @@
set name = "Pray"
if(say_disabled) //This is here to try to identify lag problems
usr << "<span class='danger'>Speech is currently admin-disabled.</span>"
to_chat(usr, "<span class='danger'>Speech is currently admin-disabled.</span>")
return
msg = copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)
@@ -12,7 +12,7 @@
log_prayer("[src.key]/([src.name]): [msg]")
if(usr.client)
if(usr.client.prefs.muted & MUTE_PRAY)
usr << "<span class='danger'>You cannot pray (muted).</span>"
to_chat(usr, "<span class='danger'>You cannot pray (muted).</span>")
return
if(src.client.handle_spam_prevention(msg,MUTE_PRAY))
return
@@ -37,11 +37,11 @@
for(var/client/C in admins)
if(C.prefs.chat_toggles & CHAT_PRAYER)
C << msg
to_chat(C, msg)
if(C.prefs.toggles & SOUND_PRAYERS)
if(usr.job == "Chaplain")
C << 'sound/effects/pray.ogg'
usr << "Your prayers have been received by the gods."
to_chat(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]")
@@ -53,7 +53,7 @@
[ADMIN_FULLMONTY(Sender)] [ADMIN_BSA(Sender)] \
[ADMIN_CENTCOM_REPLY(Sender)]:</b> \
[msg]</span>"
admins << msg
to_chat(admins, msg)
for(var/obj/machinery/computer/communications/C in machines)
C.overrideCooldown()
@@ -64,7 +64,7 @@
[ADMIN_FULLMONTY(Sender)] [ADMIN_BSA(Sender)] \
[ADMIN_SYNDICATE_REPLY(Sender)]:</b> \
[msg]</span>"
admins << msg
to_chat(admins, msg)
for(var/obj/machinery/computer/communications/C in machines)
C.overrideCooldown()
@@ -76,6 +76,6 @@
[ADMIN_CENTCOM_REPLY(Sender)] \
[ADMIN_SET_SD_CODE]:</b> \
[msg]</span>"
admins << msg
to_chat(admins, msg)
for(var/obj/machinery/computer/communications/C in machines)
C.overrideCooldown()
+51 -79
View File
@@ -2,7 +2,7 @@
set category = null
set name = "Drop Everything"
if(!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
var/confirm = alert(src, "Make [M] drop everything?", "Message", "Yes", "No")
@@ -26,7 +26,7 @@
if(!ismob(M))
return
if (!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
message_admins("[key_name_admin(src)] has started answering [key_name(M.key, 0, 0)]'s prayer.")
@@ -38,7 +38,7 @@
if(usr)
if (usr.client)
if(usr.client.holder)
M << "<i>You hear a voice in your head... <b>[msg]</i></b>"
to_chat(M, "<i>You hear a voice in your head... <b>[msg]</i></b>")
log_admin("SubtlePM: [key_name(usr)] -> [key_name(M)] : [msg]")
message_admins("<span class='adminnotice'><b> SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] :</b> [msg]</span>")
@@ -49,14 +49,14 @@
set name = "Global Narrate"
if (!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
var/msg = input("Message:", text("Enter the text you wish to appear to everyone:")) as text
if (!msg)
return
world << "[msg]"
to_chat(world, "[msg]")
log_admin("GlobalNarrate: [key_name(usr)] : [msg]")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] Sent a global narrate</span>")
feedback_add_details("admin_verb","GLN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -66,7 +66,7 @@
set name = "Direct Narrate"
if(!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
if(!M)
@@ -80,7 +80,7 @@
if( !msg )
return
M << msg
to_chat(M, msg)
log_admin("DirectNarrate: [key_name(usr)] to ([M.name]/[M.key]): [msg]")
message_admins("<span class='adminnotice'><b> DirectNarrate: [key_name(usr)] to ([M.name]/[M.key]):</b> [msg]<BR></span>")
feedback_add_details("admin_verb","DIRN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -90,7 +90,7 @@
set name = "Local Narrate"
if (!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
if(!A)
return
@@ -101,7 +101,7 @@
if (!msg)
return
for(var/mob/M in view(range,A))
M << msg
to_chat(M, msg)
log_admin("LocalNarrate: [key_name(usr)] at ([get_area(A)]): [msg]")
message_admins("<span class='adminnotice'><b> LocalNarrate: [key_name_admin(usr)] at (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[A.x];Y=[A.y];Z=[A.z]'>[get_area(A)]</a>):</b> [msg]<BR></span>")
@@ -111,10 +111,10 @@
set category = "Special Verbs"
set name = "Godmode"
if(!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
M.status_flags ^= GODMODE
usr << "<span class='adminnotice'>Toggled [(M.status_flags & GODMODE) ? "ON" : "OFF"]</span>"
to_chat(usr, "<span class='adminnotice'>Toggled [(M.status_flags & GODMODE) ? "ON" : "OFF"]</span>")
log_admin("[key_name(usr)] has toggled [key_name(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]")
message_admins("[key_name_admin(usr)] has toggled [key_name_admin(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]")
@@ -172,7 +172,7 @@
log_admin("SPAM AUTOMUTE: [muteunmute] [key_name(whom)] from [mute_string]")
message_admins("SPAM AUTOMUTE: [muteunmute] [key_name_admin(whom)] from [mute_string].")
if(C)
C << "You have been [muteunmute] from [mute_string] by the SPAM AUTOMUTE system. Contact an admin."
to_chat(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
@@ -186,7 +186,7 @@
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].")
if(C)
C << "You have been [muteunmute] from [mute_string] by [key_name(usr, include_name = FALSE)]."
to_chat(C, "You have been [muteunmute] from [mute_string] by [key_name(usr, include_name = FALSE)].")
feedback_add_details("admin_verb","MUTE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -207,7 +207,7 @@
if(candidates.len)
ckey = input("Pick the player you want to respawn as a xeno.", "Suitable Candidates") as null|anything in candidates
else
usr << "<font color='red'>Error: create_xeno(): no suitable candidates.</font>"
to_chat(usr, "<font color='red'>Error: create_xeno(): no suitable candidates.</font>")
if(!istext(ckey))
return 0
@@ -244,7 +244,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set name = "Respawn Character"
set desc = "Respawn a person that has been gibbed/dusted/killed. They must be a ghost for this to work and preferably should not have a body to go back into."
if(!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
var/input = ckey(input(src, "Please specify which key will be respawned.", "Key", ""))
if(!input)
@@ -257,7 +257,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
break
if(!G_found)//If a ghost was not found.
usr << "<font color='red'>There is no active key like that in the game or the person is not currently a ghost.</font>"
to_chat(usr, "<font color='red'>There is no active key like that in the game or the person is not currently a ghost.</font>")
return
if(G_found.mind && !G_found.mind.active) //mind isn't currently in use by someone/something
@@ -289,7 +289,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
//Now to give them their mind back.
G_found.mind.transfer_to(new_xeno) //be careful when doing stuff like this! I've already checked the mind isn't in use
new_xeno.key = G_found.key
new_xeno << "You have been fully respawned. Enjoy the game."
to_chat(new_xeno, "You have been fully respawned. Enjoy the game.")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has respawned [new_xeno.key] as a filthy xeno.</span>")
return //all done. The ghost is auto-deleted
@@ -299,7 +299,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/mob/living/carbon/monkey/new_monkey = new(pick(latejoin))
G_found.mind.transfer_to(new_monkey) //be careful when doing stuff like this! I've already checked the mind isn't in use
new_monkey.key = G_found.key
new_monkey << "You have been fully respawned. Enjoy the game."
to_chat(new_monkey, "You have been fully respawned. Enjoy the game.")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has respawned [new_monkey.key] as a filthy xeno.</span>")
return //all done. The ghost is auto-deleted
@@ -395,11 +395,11 @@ Traitors and the like can also be revived with the previous role mostly intact.
data_core.manifest_inject(new_character)
if(alert(new_character,"Would you like an active AI to announce this character?",,"No","Yes")=="Yes")
call(/mob/new_player/proc/AnnounceArrival)(new_character, new_character.mind.assigned_role)
AnnounceArrival(new_character, new_character.mind.assigned_role)
message_admins("<span class='adminnotice'>[admin] has respawned [player_key] as [new_character.real_name].</span>")
new_character << "You have been fully respawned. Enjoy the game."
to_chat(new_character, "You have been fully respawned. Enjoy the game.")
feedback_add_details("admin_verb","RSPCH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return new_character
@@ -408,7 +408,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set category = "Fun"
set name = "Add Custom AI law"
if(!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
var/input = input(usr, "Please enter anything you want the AI to do. Anything. Serious.", "What?", "") as text|null
if(!input)
@@ -430,7 +430,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set category = "Special Verbs"
set name = "Rejuvenate"
if(!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
if(!mob)
return
@@ -447,19 +447,19 @@ Traitors and the like can also be revived with the previous role mostly intact.
set category = "Special Verbs"
set name = "Create Command Report"
if(!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
var/input = input(usr, "Please enter anything you want. Anything. Serious.", "What?", "") as message|null
if(!input)
return
var/confirm = alert(src, "Do you want to announce the contents of the report to the crew?", "Announce", "Yes", "No")
var/announce_command_report = TRUE
if(confirm == "Yes")
priority_announce(input, null, 'sound/AI/commandreport.ogg')
else
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg')
announce_command_report = FALSE
print_command_report(input,"[confirm=="Yes" ? "" : "Classified "][command_name()] Update")
print_command_report(input,"[confirm=="Yes" ? "" : "Classified "][command_name()] Update",announce=announce_command_report)
log_admin("[key_name(src)] has created a command report: [input]")
message_admins("[key_name_admin(src)] has created a command report")
@@ -469,7 +469,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set category = "Special Verbs"
set name = "Change Command Name"
if(!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
var/input = input(usr, "Please input a new name for Central Command.", "What?", "") as text|null
if(!input)
@@ -483,7 +483,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set name = "Delete"
if (!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
if (alert(src, "Are you sure you want to delete:\n[O]\nat ([O.x], [O.y], [O.z])?", "Confirmation", "Yes", "No") == "Yes")
@@ -501,17 +501,17 @@ Traitors and the like can also be revived with the previous role mostly intact.
set name = "Manage Job Slots"
if (!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
holder.manage_free_slots()
feedback_add_details("admin_verb","MFS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in world)
set category = "Dangerous"
set category = "Special Verbs"
set name = "Explosion"
if (!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
var/devastation = input("Range of total devastation. -1 to none", text("Input")) as num|null
@@ -539,11 +539,11 @@ Traitors and the like can also be revived with the previous role mostly intact.
return
/client/proc/cmd_admin_emp(atom/O as obj|mob|turf in world)
set category = "Dangerous"
set category = "Special Verbs"
set name = "EM Pulse"
if (!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
var/heavy = input("Range of heavy pulse.", text("Input")) as num|null
@@ -567,7 +567,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set name = "Gib"
if (!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
var/confirm = alert(src, "Drop a brain?", "Confirm", "Yes", "No","Cancel")
@@ -606,7 +606,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/list/L = M.get_contents()
for(var/t in L)
usr << "[t]"
to_chat(usr, "[t]")
feedback_add_details("admin_verb","CC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/toggle_view_range()
@@ -633,7 +633,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
return
if (!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No")
@@ -664,29 +664,19 @@ Traitors and the like can also be revived with the previous role mostly intact.
return
/client/proc/cmd_admin_attack_log(mob/M in mob_list)
set category = "Special Verbs"
set name = "Attack Log"
usr << "<span class='boldannounce'>Attack Log for [mob]</span>"
for(var/t in M.attack_log)
usr << t
feedback_add_details("admin_verb","ATTL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/everyone_random()
set category = "Dangerous"
set category = "Fun"
set name = "Make Everyone Random"
set desc = "Make everyone have a random appearance. You can only use this before rounds!"
if(ticker && ticker.mode)
usr << "Nope you can't do this, the game's already started. This only works before rounds!"
to_chat(usr, "Nope you can't do this, the game's already started. This only works before rounds!")
return
if(config.force_random_names)
config.force_random_names = 0
message_admins("Admin [key_name_admin(usr)] has disabled \"Everyone is Special\" mode.")
usr << "Disabled."
to_chat(usr, "Disabled.")
return
@@ -698,9 +688,9 @@ Traitors and the like can also be revived with the previous role mostly intact.
message_admins("Admin [key_name_admin(usr)] has forced the players to have random appearances.")
if(notifyplayers == "Yes")
world << "<span class='adminnotice'>Admin [usr.key] has forced the players to have completely random identities!</span>"
to_chat(world, "<span class='adminnotice'>Admin [usr.key] has forced the players to have completely random identities!</span>")
usr << "<i>Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet</i>."
to_chat(usr, "<i>Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet</i>.")
config.force_random_names = 1
feedback_add_details("admin_verb","MER") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -712,11 +702,11 @@ Traitors and the like can also be revived with the previous role mostly intact.
set desc = "Toggles random events such as meteors, black holes, blob (but not space dust) on/off"
if(!config.allow_random_events)
config.allow_random_events = 1
usr << "Random events enabled"
to_chat(usr, "Random events enabled")
message_admins("Admin [key_name_admin(usr)] has enabled random events.")
else
config.allow_random_events = 0
usr << "Random events disabled"
to_chat(usr, "Random events disabled")
message_admins("Admin [key_name_admin(usr)] has disabled random events.")
feedback_add_details("admin_verb","TRE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -727,7 +717,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
set desc = "Changes the security level. Announcement only, i.e. setting to Delta won't activate nuke"
if (!holder)
src << "Only administrators may use this command."
to_chat(src, "Only administrators may use this command.")
return
var/level = input("Select security level to change to","Set Security Level") as null|anything in list("green","blue","red","delta")
@@ -740,7 +730,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
/client/proc/toggle_nuke(obj/machinery/nuclearbomb/N in nuke_list)
set name = "Toggle Nuke"
set category = "Dangerous"
set category = "Fun"
set popup_menu = 0
if(!check_rights(R_DEBUG))
return
@@ -757,24 +747,6 @@ Traitors and the like can also be revived with the previous role mostly intact.
message_admins("[ADMIN_LOOKUPFLW(usr)] [N.timing ? "activated" : "deactivated"] a nuke at [ADMIN_COORDJMP(N)].")
feedback_add_details("admin_verb","TN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/reset_latejoin_spawns()
set category = "Debug"
set name = "Remove Latejoin Spawns"
if(!check_rights(R_DEBUG))
return
var/confirm = alert(src, "Disable Latejoin spawns??", "Message", "Yes", "No")
if(confirm != "Yes")
return
latejoin.Cut()
log_admin("[key_name(usr)] removed latejoin spawnpoints.")
message_admins("[key_name_admin(usr)] removed latejoin spawnpoints.")
var/list/datum/outfit/custom_outfits = list() //Admin created outfits
/client/proc/create_outfits()
@@ -969,7 +941,7 @@ var/list/datum/outfit/custom_outfits = list() //Admin created outfits
var/datum/atom_hud/antag/H = G.ganghud
(adding_hud) ? H.add_hud_to(usr) : H.remove_hud_from(usr)
usr << "You toggled your admin antag HUD [adding_hud ? "ON" : "OFF"]."
to_chat(usr, "You toggled your admin antag HUD [adding_hud ? "ON" : "OFF"].")
message_admins("[key_name_admin(usr)] toggled their admin antag HUD [adding_hud ? "ON" : "OFF"].")
log_admin("[key_name(usr)] toggled their admin antag HUD [adding_hud ? "ON" : "OFF"].")
feedback_add_details("admin_verb","TAH") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -983,7 +955,7 @@ var/list/datum/outfit/custom_outfits = list() //Admin created outfits
M.ui_interact(usr)
/client/proc/mass_zombie_infection()
set category = "Dangerous"
set category = "Fun"
set name = "Mass Zombie Infection"
set desc = "Infects all humans with a latent organ that will zombify \
them on death."
@@ -1003,7 +975,7 @@ var/list/datum/outfit/custom_outfits = list() //Admin created outfits
feedback_add_details("admin_verb","MZI")
/client/proc/mass_zombie_cure()
set category = "Dangerous"
set category = "Fun"
set name = "Mass Zombie Cure"
set desc = "Removes the zombie infection from all humans, returning them to normal."
if(!holder)
@@ -1021,7 +993,7 @@ var/list/datum/outfit/custom_outfits = list() //Admin created outfits
feedback_add_details("admin_verb","MZC")
/client/proc/polymorph_all()
set category = "Dangerous"
set category = "Fun"
set name = "Polymorph All"
set desc = "Applies the effects of the bolt of change to every single mob."
@@ -1109,7 +1081,7 @@ var/list/datum/outfit/custom_outfits = list() //Admin created outfits
return
if(ON_PURRBATION(H))
return
H << "Something is nya~t right."
to_chat(H, "Something is nya~t right.")
H.dna.features["tail_human"] = "Cat"
H.dna.features["ears"] = "Cat"
H.regenerate_icons()
@@ -1120,7 +1092,7 @@ var/list/datum/outfit/custom_outfits = list() //Admin created outfits
return
if(!ON_PURRBATION(H))
return
H << "You are no longer a cat."
to_chat(H, "You are no longer a cat.")
H.dna.features["tail_human"] = "None"
H.dna.features["ears"] = "None"
H.regenerate_icons()
@@ -2,7 +2,7 @@
set category = "Special Verbs"
set name = "Reestablish DB Connection"
if (!config.sql_enabled)
usr << "<span class='adminnotice'>The Database is not enabled!</span>"
to_chat(usr, "<span class='adminnotice'>The Database is not enabled!</span>")
return
if (dbcon && dbcon.IsConnected())
+4 -4
View File
@@ -3,18 +3,18 @@
set name = "Create AI Triumvirate"
if(ticker.current_state > GAME_STATE_PREGAME)
usr << "This option is currently only usable during pregame. This may change at a later date."
to_chat(usr, "This option is currently only usable during pregame. This may change at a later date.")
return
var/datum/job/job = SSjob.GetJob("AI")
if(!job)
usr << "Unable to locate the AI job"
to_chat(usr, "Unable to locate the AI job")
return
if(ticker.triai)
ticker.triai = 0
usr << "Only one AI will be spawned at round start."
to_chat(usr, "Only one AI will be spawned at round start.")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has toggled off triple AIs at round start.</span>")
else
ticker.triai = 1
usr << "There will be an AI Triumvirate at round start."
to_chat(usr, "There will be an AI Triumvirate at round start.")
message_admins("<span class='adminnotice'>[key_name_admin(usr)] has toggled on triple AIs at round start.</span>")