Merge branch 'master' into upstream-merge-26965
This commit is contained in:
@@ -38,7 +38,7 @@
|
||||
|
||||
if(M.client)
|
||||
body += "<br>\[<b>First Seen:</b> [M.client.player_join_date]\]\[<b>Byond account registered on:</b> [M.client.account_join_date]\]"
|
||||
body += "<br><b>Show related accounts by:</b> "
|
||||
body += "<br><br><b>Show related accounts by:</b> "
|
||||
body += "\[ <a href='?_src_=holder;showrelatedacc=cid;client=\ref[M.client]'>CID</a> | "
|
||||
body += "<a href='?_src_=holder;showrelatedacc=ip;client=\ref[M.client]'>IP</a> \]"
|
||||
|
||||
|
||||
@@ -66,7 +66,10 @@ GLOBAL_LIST_INIT(admin_verbs_admin, world.AVerbsAdmin())
|
||||
/client/proc/toggle_AI_interact, /*toggle admin ability to interact with machines as an AI*/
|
||||
/client/proc/customiseSNPC, /* Customise any interactive crewmembers in the world */
|
||||
/client/proc/resetSNPC, /* Resets any interactive crewmembers in the world */
|
||||
/client/proc/open_shuttle_manipulator /* Opens shuttle manipulator UI */
|
||||
/client/proc/open_shuttle_manipulator, /* Opens shuttle manipulator UI */
|
||||
/client/proc/deadchat,
|
||||
/client/proc/toggleprayers,
|
||||
/client/proc/toggleadminhelpsound
|
||||
)
|
||||
GLOBAL_PROTECT(admin_verbs_ban)
|
||||
GLOBAL_LIST_INIT(admin_verbs_ban, list(/client/proc/unban_panel,/client/proc/DB_ban_panel,/client/proc/stickybanpanel))
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
/datum/menu/Admin/Generate_list(client/C)
|
||||
/datum/verbs/menu/Admin/Generate_list(client/C)
|
||||
if (C.holder)
|
||||
. = ..()
|
||||
|
||||
/datum/menu/Admin/verb/playerpanel()
|
||||
/datum/verbs/menu/Admin/verb/playerpanel()
|
||||
set name = "Player Panel"
|
||||
set desc = "Player Panel"
|
||||
set category = "Admin"
|
||||
usr.client.holder.player_panel_new()
|
||||
SSblackbox.add_details("admin_verb","Player Panel New") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
return
|
||||
if(usr.client.holder)
|
||||
usr.client.holder.player_panel_new()
|
||||
SSblackbox.add_details("admin_verb","Player Panel New") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
|
||||
|
||||
@@ -506,7 +506,7 @@
|
||||
for(var/datum/mind/N in SSticker.mode.cult)
|
||||
var/mob/M = N.current
|
||||
if(M)
|
||||
dat += "<tr><td><a href='?_src_=holder;adminplayeropts=\ref[M]'>[M.real_name]</a>[M.client ? "" : " <i>(No Client)</i>"][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>"
|
||||
dat += "<tr><td><a href='?_src_=holder;adminplayeropts=\ref[M]'>[M.real_name]</a>[N.has_antag_datum(ANTAG_DATUM_CULT_MASTER) ? "<i><font color=red> \[Master\]</font></i>" : ""][M.client ? "" : " <i>(No Client)</i>"][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>"
|
||||
dat += "<td><A href='?priv_msg=[M.ckey]'>PM</A></td>"
|
||||
dat += "<td><A href='?_src_=holder;adminplayerobservefollow=\ref[M]'>FLW</a></td></tr>"
|
||||
dat += "</table>"
|
||||
|
||||
@@ -480,7 +480,8 @@
|
||||
if(minutes > GLOB.CMinutes)
|
||||
mins = minutes - GLOB.CMinutes
|
||||
mins = input(usr,"How long (in minutes)? (Default: 1440)","Ban time",mins ? mins : 1440) as num|null
|
||||
if(!mins)
|
||||
if(mins <= 0)
|
||||
to_chat(usr, "<span class='danger'>[mins] is not a valid duration.</span>")
|
||||
return
|
||||
minutes = GLOB.CMinutes + mins
|
||||
duration = GetExp(minutes)
|
||||
@@ -914,7 +915,8 @@
|
||||
switch(alert("Temporary Ban?",,"Yes","No", "Cancel"))
|
||||
if("Yes")
|
||||
var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null
|
||||
if(!mins)
|
||||
if(mins <= 0)
|
||||
to_chat(usr, "<span class='danger'>[mins] is not a valid duration.</span>")
|
||||
return
|
||||
var/reason = input(usr,"Please State Reason.","Reason") as message|null
|
||||
if(!reason)
|
||||
@@ -1109,7 +1111,8 @@
|
||||
switch(alert("Temporary Ban?",,"Yes","No", "Cancel"))
|
||||
if("Yes")
|
||||
var/mins = input(usr,"How long (in minutes)?","Ban time",1440) as num|null
|
||||
if(!mins)
|
||||
if(mins <= 0)
|
||||
to_chat(usr, "<span class='danger'>[mins] is not a valid duration.</span>")
|
||||
return
|
||||
var/reason = input(usr,"Please State Reason.","Reason") as message|null
|
||||
if(!reason)
|
||||
@@ -1739,7 +1742,7 @@
|
||||
else if(href_list["reject_custom_name"])
|
||||
if(!check_rights(R_ADMIN))
|
||||
return
|
||||
var/obj/item/station_charter/charter = locate(href_list["reject_custom_name"])
|
||||
var/obj/item/weapon/station_charter/charter = locate(href_list["reject_custom_name"])
|
||||
if(istype(charter))
|
||||
charter.reject_proposed(usr)
|
||||
else if(href_list["jumpto"])
|
||||
@@ -2239,7 +2242,7 @@
|
||||
error_viewer.show_to(owner, null, href_list["viewruntime_linear"])
|
||||
else if(href_list["showrelatedacc"])
|
||||
var/client/C = locate(href_list["client"]) in GLOB.clients
|
||||
var/list/thing_to_check
|
||||
var/thing_to_check
|
||||
if(href_list["showrelatedacc"] == "cid")
|
||||
thing_to_check = C.related_accounts_cid
|
||||
else
|
||||
@@ -2247,9 +2250,8 @@
|
||||
thing_to_check = splittext(thing_to_check, ", ")
|
||||
|
||||
|
||||
var/dat = "Related accounts by [uppertext(href_list["showrelatedacc"])]:<br>"
|
||||
for(var/thing in thing_to_check)
|
||||
dat += "[thing]<br>"
|
||||
var/list/dat = list("Related accounts by [uppertext(href_list["showrelatedacc"])]:")
|
||||
dat += thing_to_check
|
||||
|
||||
usr << browse(dat, "size=420x300")
|
||||
usr << browse(dat.Join("<br>"), "window=related_[C];size=420x300")
|
||||
|
||||
|
||||
@@ -24,6 +24,23 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
||||
QDEL_NULL(cstatclick)
|
||||
QDEL_NULL(rstatclick)
|
||||
return ..()
|
||||
|
||||
/datum/admin_help_tickets/proc/TicketByID(id)
|
||||
var/list/lists = list(active_tickets, closed_tickets, resolved_tickets)
|
||||
for(var/I in lists)
|
||||
for(var/J in I)
|
||||
var/datum/admin_help/AH = J
|
||||
if(AH.id == id)
|
||||
return J
|
||||
|
||||
/datum/admin_help_tickets/proc/TicketsByCKey(ckey)
|
||||
. = list()
|
||||
var/list/lists = list(active_tickets, closed_tickets, resolved_tickets)
|
||||
for(var/I in lists)
|
||||
for(var/J in I)
|
||||
var/datum/admin_help/AH = J
|
||||
if(AH.initiator_ckey == ckey)
|
||||
. += AH
|
||||
|
||||
//private
|
||||
/datum/admin_help_tickets/proc/ListInsert(datum/admin_help/new_ticket)
|
||||
|
||||
@@ -203,19 +203,19 @@
|
||||
|
||||
if(irc)
|
||||
log_admin_private("PM: [key_name(src)]->IRC: [rawmsg]")
|
||||
for(var/client/X in GLOB.admins)
|
||||
to_chat(X, "<B><font color='blue'>PM: [key_name(src, X, 0)]->IRC:</B> \blue [keywordparsedmsg]</font>" )
|
||||
for(var/client/X in GLOB.admins)
|
||||
to_chat(X, "<font color='blue'><B>PM: [key_name(src, X, 0)]->IRC:</B> [keywordparsedmsg]</font>")
|
||||
else
|
||||
window_flash(recipient, ignorepref = TRUE)
|
||||
log_admin_private("PM: [key_name(src)]->[key_name(recipient)]: [rawmsg]")
|
||||
//we don't use message_admins here because the sender/receiver might get it too
|
||||
for(var/client/X in GLOB.admins)
|
||||
if(X.key!=key && X.key!=recipient.key) //check client/X is an admin and isn't the sender or recipient
|
||||
to_chat(X, "<B><font color='blue'>PM: [key_name(src, X, 0)]->[key_name(recipient, X, 0)]:</B> \blue [keywordparsedmsg]</font>" )
|
||||
|
||||
to_chat(X, "<font color='blue'><B>PM: [key_name(src, X, 0)]->[key_name(recipient, X, 0)]:</B> [keywordparsedmsg]</font>" )
|
||||
|
||||
|
||||
|
||||
#define IRC_AHELP_USAGE "Usage: ticket <close|resolve|icissue|reject|reopen \[ticket #\]|list>"
|
||||
/proc/IrcPm(target,msg,sender)
|
||||
var/client/C = GLOB.directory[target]
|
||||
|
||||
@@ -225,7 +225,7 @@
|
||||
var/list/splits = splittext(compliant_msg, " ")
|
||||
if(splits.len && splits[1] == "ticket")
|
||||
if(splits.len < 2)
|
||||
return "Usage: ticket <close|resolve|icissue|reject>"
|
||||
return IRC_AHELP_USAGE
|
||||
switch(splits[2])
|
||||
if("close")
|
||||
if(ticket)
|
||||
@@ -243,8 +243,36 @@
|
||||
if(ticket)
|
||||
ticket.Reject(irc_tagged)
|
||||
return "Ticket #[ticket.id] successfully rejected"
|
||||
if("reopen")
|
||||
if(ticket)
|
||||
return "Error: [target] already has ticket #[ticket.id] open"
|
||||
var/fail = splits.len < 3 ? null : -1
|
||||
if(!isnull(fail))
|
||||
fail = text2num(splits[3])
|
||||
if(isnull(fail))
|
||||
return "Error: No/Invalid ticket id specified. [IRC_AHELP_USAGE]"
|
||||
var/datum/admin_help/AH = GLOB.ahelp_tickets.TicketByID(fail)
|
||||
if(!AH)
|
||||
return "Error: Ticket #[fail] not found"
|
||||
if(AH.initiator_ckey != target)
|
||||
return "Error: Ticket #[fail] belongs to [AH.initiator_ckey]"
|
||||
AH.Reopen()
|
||||
return "Ticket #[ticket.id] successfully reopened"
|
||||
if("list")
|
||||
var/list/tickets = GLOB.ahelp_tickets.TicketsByCKey(target)
|
||||
if(!tickets.len)
|
||||
return "None"
|
||||
. = ""
|
||||
for(var/I in tickets)
|
||||
var/datum/admin_help/AH = I
|
||||
if(.)
|
||||
. += ", "
|
||||
if(AH == ticket)
|
||||
. += "Active: "
|
||||
. += "#[AH.id]"
|
||||
return
|
||||
else
|
||||
return "Usage: ticket <close|resolve|icissue|reject>"
|
||||
return IRC_AHELP_USAGE
|
||||
return "Error: Ticket could not be found"
|
||||
|
||||
var/static/stealthkey
|
||||
|
||||
@@ -114,47 +114,49 @@
|
||||
return
|
||||
|
||||
/datum/buildmode/proc/show_help(mob/user)
|
||||
var/list/dat = list()
|
||||
switch(mode)
|
||||
if(BASIC_BUILDMODE)
|
||||
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 ***********************************************************")
|
||||
dat += "***********************************************************"
|
||||
dat += "Left Mouse Button = Construct / Upgrade"
|
||||
dat += "Right Mouse Button = Deconstruct / Delete / Downgrade"
|
||||
dat += "Left Mouse Button + ctrl = R-Window"
|
||||
dat += "Left Mouse Button + alt = Airlock"
|
||||
dat += ""
|
||||
dat += "Use the button in the upper left corner to"
|
||||
dat += "change the direction of built objects."
|
||||
dat += "***********************************************************"
|
||||
if(ADV_BUILDMODE)
|
||||
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 ***********************************************************")
|
||||
dat += "***********************************************************"
|
||||
dat += "Right Mouse Button on buildmode button = Set object type"
|
||||
dat += "Left Mouse Button on turf/obj = Place objects"
|
||||
dat += "Right Mouse Button = Delete objects"
|
||||
dat += ""
|
||||
dat += "Use the button in the upper left corner to"
|
||||
dat += "change the direction of built objects."
|
||||
dat += "***********************************************************"
|
||||
if(VAR_BUILDMODE)
|
||||
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 ***********************************************************")
|
||||
dat += "***********************************************************"
|
||||
dat += "Right Mouse Button on buildmode button = Select var(type) & value"
|
||||
dat += "Left Mouse Button on turf/obj/mob = Set var(type) & value"
|
||||
dat += "Right Mouse Button on turf/obj/mob = Reset var's value"
|
||||
dat += "***********************************************************"
|
||||
if(THROW_BUILDMODE)
|
||||
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 ***********************************************************")
|
||||
dat += "***********************************************************"
|
||||
dat += "Left Mouse Button on turf/obj/mob = Select"
|
||||
dat += "Right Mouse Button on turf/obj/mob = Throw"
|
||||
dat += "***********************************************************"
|
||||
if(AREA_BUILDMODE)
|
||||
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 ***********************************************************")
|
||||
dat += "***********************************************************"
|
||||
dat += "Left Mouse Button on turf/obj/mob = Select corner"
|
||||
dat += "Right Mouse Button on buildmode button = Select generator"
|
||||
dat += "***********************************************************"
|
||||
if(COPY_BUILDMODE)
|
||||
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 ***********************************************************")
|
||||
dat += "***********************************************************"
|
||||
dat += "Left Mouse Button on obj/turf/mob = Spawn a Copy of selected target"
|
||||
dat += "Right Mouse Button on obj/mob = Select target to copy"
|
||||
dat += "***********************************************************"
|
||||
to_chat(user, "<font color='blue'>[dat.Join("\n")]</font>")
|
||||
|
||||
/datum/buildmode/proc/change_settings(mob/user)
|
||||
switch(mode)
|
||||
|
||||
@@ -14,11 +14,12 @@
|
||||
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)
|
||||
var/list/reversed = M.logging[log_type]
|
||||
reversed = reverseRange(reversed.Copy())
|
||||
dat += "<center><b>[log_type]</b></center><br>"
|
||||
for(var/entry in reversed)
|
||||
dat += "<font size=2px>[entry]: [reversed[entry]]</font><br>"
|
||||
var/list/reversed = M.logging[log_type]
|
||||
if(islist(reversed))
|
||||
reversed = reverseRange(reversed.Copy())
|
||||
for(var/entry in reversed)
|
||||
dat += "<font size=2px>[entry]: [reversed[entry]]</font><br>"
|
||||
dat += "<hr>"
|
||||
else
|
||||
dat += "<center>[type] of [key_name(M)]</center><br>"
|
||||
@@ -26,6 +27,6 @@
|
||||
if(reversed)
|
||||
reversed = reverseRange(reversed.Copy())
|
||||
for(var/entry in reversed)
|
||||
dat += "<font size=2px>[entry]: [reversed[entry]]</font><br>"
|
||||
dat += "<font size=2px>[entry]: [reversed[entry]]</font><hr>"
|
||||
|
||||
usr << browse(dat, "window=invidual_logging;size=600x480")
|
||||
usr << browse(dat, "window=invidual_logging_[M];size=600x480")
|
||||
|
||||
@@ -612,8 +612,8 @@ GLOBAL_PROTECT(VVpixelmovement)
|
||||
if (O.vv_edit_var(variable, var_new) == FALSE)
|
||||
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]]")
|
||||
var/msg = "[key_name_admin(src)] modified [original_name]'s [variable] to [O.vars[variable]]"
|
||||
log_world("### VarEdit by [src]: [O.type] [variable]=[html_encode("[var_new]")]")
|
||||
log_admin("[key_name(src)] modified [original_name]'s [variable] to [var_new]")
|
||||
var/msg = "[key_name_admin(src)] modified [original_name]'s [variable] to [var_new]"
|
||||
message_admins(msg)
|
||||
admin_ticket_log(O, msg)
|
||||
@@ -99,7 +99,7 @@ GLOBAL_VAR_INIT(highlander, FALSE)
|
||||
|
||||
var/datum/gang/multiverse/G = new(src, "[H.real_name]")
|
||||
SSticker.mode.gangs += G
|
||||
G.bosses += H.mind
|
||||
G.bosses[H.mind] = 0 //No they don't use influence but this prevents runtimes.
|
||||
G.add_gang_hud(H.mind)
|
||||
H.mind.gang_datum = G
|
||||
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
#define WHITELISTFILE "config/whitelist.txt, gamedata/config/whitelist.txt"
|
||||
|
||||
GLOBAL_LIST(whitelist)
|
||||
GLOBAL_PROTECT(whitelist)
|
||||
|
||||
/proc/load_whitelist()
|
||||
GLOB.whitelist = list()
|
||||
for(var/line in world.file2list(WHITELISTFILE))
|
||||
if(!line)
|
||||
continue
|
||||
if(findtextEx(line,"#",1,2))
|
||||
continue
|
||||
GLOB.whitelist += line
|
||||
|
||||
if(!GLOB.whitelist.len)
|
||||
GLOB.whitelist = null
|
||||
|
||||
/proc/check_whitelist(var/ckey)
|
||||
if(!GLOB.whitelist)
|
||||
return FALSE
|
||||
. = (ckey in GLOB.whitelist)
|
||||
|
||||
#undef WHITELISTFILE
|
||||
#define WHITELISTFILE "config/whitelist.txt"
|
||||
|
||||
GLOBAL_LIST(whitelist)
|
||||
GLOBAL_PROTECT(whitelist)
|
||||
|
||||
/proc/load_whitelist()
|
||||
GLOB.whitelist = list()
|
||||
for(var/line in world.file2list(WHITELISTFILE))
|
||||
if(!line)
|
||||
continue
|
||||
if(findtextEx(line,"#",1,2))
|
||||
continue
|
||||
GLOB.whitelist += ckey(line)
|
||||
|
||||
if(!GLOB.whitelist.len)
|
||||
GLOB.whitelist = null
|
||||
|
||||
/proc/check_whitelist(var/ckey)
|
||||
if(!GLOB.whitelist)
|
||||
return FALSE
|
||||
. = (ckey in GLOB.whitelist)
|
||||
|
||||
#undef WHITELISTFILE
|
||||
|
||||
Reference in New Issue
Block a user