Ports ping verb from /tg/ (#7837)

* Ports ping verb from /tg/

* Adds non-versioned files

* Removes old flag
This commit is contained in:
Atermonera
2021-01-26 22:31:26 -08:00
committed by GitHub
parent 3dd4613f95
commit f7fec4fd67
11 changed files with 448 additions and 379 deletions

View File

@@ -57,6 +57,7 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G
#define INIT_ORDER_SKYBOX 30 #define INIT_ORDER_SKYBOX 30
#define INIT_ORDER_MAPPING 25 #define INIT_ORDER_MAPPING 25
#define INIT_ORDER_DECALS 20 #define INIT_ORDER_DECALS 20
#define INIT_ORDER_PING 18
#define INIT_ORDER_JOB 17 #define INIT_ORDER_JOB 17
#define INIT_ORDER_ALARM 16 // Must initialize before atoms. #define INIT_ORDER_ALARM 16 // Must initialize before atoms.
#define INIT_ORDER_ATOMS 15 #define INIT_ORDER_ATOMS 15
@@ -89,6 +90,7 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G
#define FIRE_PRIORITY_NIGHTSHIFT 5 #define FIRE_PRIORITY_NIGHTSHIFT 5
#define FIRE_PRIORITY_ORBIT 8 #define FIRE_PRIORITY_ORBIT 8
#define FIRE_PRIORITY_VOTE 9 #define FIRE_PRIORITY_VOTE 9
#define FIRE_PRIORITY_PING 9
#define FIRE_PRIORITY_AI 10 #define FIRE_PRIORITY_AI 10
#define FIRE_PRIORITY_GARBAGE 15 #define FIRE_PRIORITY_GARBAGE 15
#define FIRE_PRIORITY_ALARM 20 #define FIRE_PRIORITY_ALARM 20

View File

@@ -0,0 +1,30 @@
#define PING_BUFFER_TIME 25
SUBSYSTEM_DEF(ping)
name = "Ping"
wait = 6
flags = SS_NO_INIT|SS_POST_FIRE_TIMING
priority = FIRE_PRIORITY_PING
init_order = INIT_ORDER_PING
runlevels = RUNLEVEL_LOBBY|RUNLEVEL_SETUP|RUNLEVEL_GAME|RUNLEVEL_POSTGAME
var/list/currentrun
/datum/controller/subsystem/ping/fire(resumed = FALSE)
if (!resumed)
src.currentrun = GLOB.clients.Copy()
var/list/currentrun = src.currentrun
while (length(currentrun))
var/client/C = currentrun[currentrun.len]
currentrun.len--
if (!C || world.time - C.connection_time < PING_BUFFER_TIME)
if (MC_TICK_CHECK)
return
continue
winset(C, null, "command=.update_ping+[world.time+world.tick_lag*world.tick_usage/100]")
if (MC_TICK_CHECK) //one day, when ss13 has 1000 people per server, you guys are gonna be glad I added this tick check
return
currentrun = null
#undef PING_BUFFER_TIME

View File

@@ -73,3 +73,6 @@
var/connection_realtime var/connection_realtime
///world.timeofday they connected ///world.timeofday they connected
var/connection_timeofday var/connection_timeofday
var/lastping = 0
var/avgping = 0

View File

@@ -490,4 +490,4 @@ client/verb/character_setup()
//Went fine //Went fine
else else
ip_reputation = score ip_reputation = score
return TRUE return TRUE

View File

@@ -66,6 +66,8 @@
entry += "[round(seconds / 60)] minutes, " entry += "[round(seconds / 60)] minutes, "
entry += "[seconds % 60] seconds)" entry += "[seconds % 60] seconds)"
entry += "</td><td>"
entry += " ([round(C.avgping, 1)]ms)"
entry += "</td><td>" entry += "</td><td>"
entry += " (<A HREF='?_src_=holder;adminmoreinfo=\ref[C.mob]'>?</A>)" entry += " (<A HREF='?_src_=holder;adminmoreinfo=\ref[C.mob]'>?</A>)"
entry += "</td></tr>" entry += "</td></tr>"
@@ -85,6 +87,8 @@
entry += " - <span class='blue'>In Lobby</span><br>" entry += " - <span class='blue'>In Lobby</span><br>"
else else
entry += " - <span class='green'>Playing</span><br>" entry += " - <span class='green'>Playing</span><br>"
entry += " ([round(C.avgping, 1)]ms)"
Lines += entry Lines += entry
msg += "<table>" msg += "<table>"

View File

@@ -1,186 +1,186 @@
/client/verb/ooc(msg as text) /client/verb/ooc(msg as text)
set name = "OOC" set name = "OOC"
set category = "OOC" set category = "OOC"
if(say_disabled) //This is here to try to identify lag problems if(say_disabled) //This is here to try to identify lag problems
to_chat(usr, "<span class='warning'>Speech is currently admin-disabled.</span>") to_chat(usr, "<span class='warning'>Speech is currently admin-disabled.</span>")
return return
if(!mob) return if(!mob) return
if(IsGuestKey(key)) if(IsGuestKey(key))
to_chat(src, "Guests may not use OOC.") to_chat(src, "Guests may not use OOC.")
return return
msg = sanitize(msg) msg = sanitize(msg)
if(!msg) return if(!msg) return
if(!is_preference_enabled(/datum/client_preference/show_ooc)) if(!is_preference_enabled(/datum/client_preference/show_ooc))
to_chat(src, "<span class='warning'>You have OOC muted.</span>") to_chat(src, "<span class='warning'>You have OOC muted.</span>")
return return
if(!holder) if(!holder)
if(!config.ooc_allowed) if(!config.ooc_allowed)
to_chat(src, "<span class='danger'>OOC is globally muted.</span>") to_chat(src, "<span class='danger'>OOC is globally muted.</span>")
return return
if(!config.dooc_allowed && (mob.stat == DEAD)) if(!config.dooc_allowed && (mob.stat == DEAD))
to_chat(usr, "<span class='danger'>OOC for dead mobs has been turned off.</span>") to_chat(usr, "<span class='danger'>OOC for dead mobs has been turned off.</span>")
return return
if(prefs.muted & MUTE_OOC) if(prefs.muted & MUTE_OOC)
to_chat(src, "<span class='danger'>You cannot use OOC (muted).</span>") to_chat(src, "<span class='danger'>You cannot use OOC (muted).</span>")
return return
if(findtext(msg, "byond://") && !config.allow_byond_links) if(findtext(msg, "byond://") && !config.allow_byond_links)
to_chat(src, "<B>Advertising other servers is not allowed.</B>") to_chat(src, "<B>Advertising other servers is not allowed.</B>")
log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]") log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]")
message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]") message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]")
return return
if(findtext(msg, "discord.gg") && !config.allow_discord_links) if(findtext(msg, "discord.gg") && !config.allow_discord_links)
to_chat(src, "<B>Advertising discords is not allowed.</B>") to_chat(src, "<B>Advertising discords is not allowed.</B>")
log_admin("[key_name(src)] has attempted to advertise a discord server in OOC: [msg]") log_admin("[key_name(src)] has attempted to advertise a discord server in OOC: [msg]")
message_admins("[key_name_admin(src)] has attempted to advertise a discord server in OOC: [msg]") message_admins("[key_name_admin(src)] has attempted to advertise a discord server in OOC: [msg]")
return return
if((findtext(msg, "http://") || findtext(msg, "https://")) && !config.allow_url_links) if((findtext(msg, "http://") || findtext(msg, "https://")) && !config.allow_url_links)
to_chat(src, "<B>Posting external links is not allowed.</B>") to_chat(src, "<B>Posting external links is not allowed.</B>")
log_admin("[key_name(src)] has attempted to post a link in OOC: [msg]") log_admin("[key_name(src)] has attempted to post a link in OOC: [msg]")
message_admins("[key_name_admin(src)] has attempted to post a link in OOC: [msg]") message_admins("[key_name_admin(src)] has attempted to post a link in OOC: [msg]")
return return
log_ooc(msg, src) log_ooc(msg, src)
if(msg) if(msg)
handle_spam_prevention(MUTE_OOC) handle_spam_prevention(MUTE_OOC)
var/ooc_style = "everyone" var/ooc_style = "everyone"
if(holder && !holder.fakekey) if(holder && !holder.fakekey)
ooc_style = "elevated" ooc_style = "elevated"
if(holder.rights & R_ADMIN) if(holder.rights & R_ADMIN)
ooc_style = "admin" ooc_style = "admin"
else if(holder.rights & R_EVENT) else if(holder.rights & R_EVENT)
ooc_style = "event_manager" ooc_style = "event_manager"
else if(holder.rights & R_DEBUG) else if(holder.rights & R_DEBUG)
ooc_style = "developer" ooc_style = "developer"
else if(holder.rights & R_MOD) else if(holder.rights & R_MOD)
ooc_style = "moderator" ooc_style = "moderator"
for(var/client/target in GLOB.clients) for(var/client/target in GLOB.clients)
if(target.is_preference_enabled(/datum/client_preference/show_ooc)) if(target.is_preference_enabled(/datum/client_preference/show_ooc))
if(target.is_key_ignored(key)) // If we're ignored by this person, then do nothing. if(target.is_key_ignored(key)) // If we're ignored by this person, then do nothing.
continue continue
var/display_name = src.key var/display_name = src.key
if(holder) if(holder)
if(holder.fakekey) if(holder.fakekey)
if(target.holder) if(target.holder)
display_name = "[holder.fakekey]/([src.key])" display_name = "[holder.fakekey]/([src.key])"
else else
display_name = holder.fakekey display_name = holder.fakekey
if(holder && !holder.fakekey && (holder.rights & R_ADMIN|R_FUN|R_EVENT) && config.allow_admin_ooccolor && (src.prefs.ooccolor != initial(src.prefs.ooccolor))) // keeping this for the badmins if(holder && !holder.fakekey && (holder.rights & R_ADMIN|R_FUN|R_EVENT) && config.allow_admin_ooccolor && (src.prefs.ooccolor != initial(src.prefs.ooccolor))) // keeping this for the badmins
to_chat(target, "<font color='[src.prefs.ooccolor]'><span class='ooc'>" + create_text_tag("ooc", "OOC:", target) + " <EM>[display_name]:</EM> <span class='message'>[msg]</span></span></font>") to_chat(target, "<font color='[src.prefs.ooccolor]'><span class='ooc'>" + create_text_tag("ooc", "OOC:", target) + " <EM>[display_name]:</EM> <span class='message'>[msg]</span></span></font>")
else else
to_chat(target, "<span class='ooc'><span class='[ooc_style]'>" + create_text_tag("ooc", "OOC:", target) + " <EM>[display_name]:</EM> <span class='message'>[msg]</span></span></span>") to_chat(target, "<span class='ooc'><span class='[ooc_style]'>" + create_text_tag("ooc", "OOC:", target) + " <EM>[display_name]:</EM> <span class='message'>[msg]</span></span></span>")
/client/verb/looc(msg as text) /client/verb/looc(msg as text)
set name = "LOOC" set name = "LOOC"
set desc = "Local OOC, seen only by those in view." set desc = "Local OOC, seen only by those in view."
set category = "OOC" set category = "OOC"
if(say_disabled) //This is here to try to identify lag problems if(say_disabled) //This is here to try to identify lag problems
to_chat(usr, "<span class='danger'>Speech is currently admin-disabled.</span>") to_chat(usr, "<span class='danger'>Speech is currently admin-disabled.</span>")
return return
if(!mob) if(!mob)
return return
if(IsGuestKey(key)) if(IsGuestKey(key))
to_chat(src, "Guests may not use OOC.") to_chat(src, "Guests may not use OOC.")
return return
msg = sanitize(msg) msg = sanitize(msg)
if(!msg) if(!msg)
return return
if(!is_preference_enabled(/datum/client_preference/show_looc)) if(!is_preference_enabled(/datum/client_preference/show_looc))
to_chat(src, "<span class='danger'>You have LOOC muted.</span>") to_chat(src, "<span class='danger'>You have LOOC muted.</span>")
return return
if(!holder) if(!holder)
if(!config.looc_allowed) if(!config.looc_allowed)
to_chat(src, "<span class='danger'>LOOC is globally muted.</span>") to_chat(src, "<span class='danger'>LOOC is globally muted.</span>")
return return
if(!config.dooc_allowed && (mob.stat == DEAD)) if(!config.dooc_allowed && (mob.stat == DEAD))
to_chat(usr, "<span class='danger'>OOC for dead mobs has been turned off.</span>") to_chat(usr, "<span class='danger'>OOC for dead mobs has been turned off.</span>")
return return
if(prefs.muted & MUTE_OOC) if(prefs.muted & MUTE_OOC)
to_chat(src, "<span class='danger'>You cannot use OOC (muted).</span>") to_chat(src, "<span class='danger'>You cannot use OOC (muted).</span>")
return return
if(findtext(msg, "byond://") && !config.allow_byond_links) if(findtext(msg, "byond://") && !config.allow_byond_links)
to_chat(src, "<B>Advertising other servers is not allowed.</B>") to_chat(src, "<B>Advertising other servers is not allowed.</B>")
log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]") log_admin("[key_name(src)] has attempted to advertise in OOC: [msg]")
message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]") message_admins("[key_name_admin(src)] has attempted to advertise in OOC: [msg]")
return return
if(findtext(msg, "discord.gg") && !config.allow_discord_links) if(findtext(msg, "discord.gg") && !config.allow_discord_links)
to_chat(src, "<B>Advertising discords is not allowed.</B>") to_chat(src, "<B>Advertising discords is not allowed.</B>")
log_admin("[key_name(src)] has attempted to advertise a discord server in OOC: [msg]") log_admin("[key_name(src)] has attempted to advertise a discord server in OOC: [msg]")
message_admins("[key_name_admin(src)] has attempted to advertise a discord server in OOC: [msg]") message_admins("[key_name_admin(src)] has attempted to advertise a discord server in OOC: [msg]")
return return
if((findtext(msg, "http://") || findtext(msg, "https://")) && !config.allow_url_links) if((findtext(msg, "http://") || findtext(msg, "https://")) && !config.allow_url_links)
to_chat(src, "<B>Posting external links is not allowed.</B>") to_chat(src, "<B>Posting external links is not allowed.</B>")
log_admin("[key_name(src)] has attempted to post a link in OOC: [msg]") log_admin("[key_name(src)] has attempted to post a link in OOC: [msg]")
message_admins("[key_name_admin(src)] has attempted to post a link in OOC: [msg]") message_admins("[key_name_admin(src)] has attempted to post a link in OOC: [msg]")
return return
log_looc(msg,src) log_looc(msg,src)
if(msg) if(msg)
handle_spam_prevention(MUTE_OOC) handle_spam_prevention(MUTE_OOC)
var/mob/source = mob.get_looc_source() var/mob/source = mob.get_looc_source()
var/turf/T = get_turf(source) var/turf/T = get_turf(source)
if(!T) return if(!T) return
var/list/in_range = get_mobs_and_objs_in_view_fast(T,world.view,0) var/list/in_range = get_mobs_and_objs_in_view_fast(T,world.view,0)
var/list/m_viewers = in_range["mobs"] var/list/m_viewers = in_range["mobs"]
var/list/receivers = list() //Clients, not mobs. var/list/receivers = list() //Clients, not mobs.
var/list/r_receivers = list() var/list/r_receivers = list()
var/display_name = key var/display_name = key
if(holder && holder.fakekey) if(holder && holder.fakekey)
display_name = holder.fakekey display_name = holder.fakekey
if(mob.stat != DEAD) if(mob.stat != DEAD)
display_name = mob.name display_name = mob.name
// Everyone in normal viewing range of the LOOC // Everyone in normal viewing range of the LOOC
for(var/mob/viewer in m_viewers) for(var/mob/viewer in m_viewers)
if(viewer.client && viewer.client.is_preference_enabled(/datum/client_preference/show_looc)) if(viewer.client && viewer.client.is_preference_enabled(/datum/client_preference/show_looc))
receivers |= viewer.client receivers |= viewer.client
else if(istype(viewer,/mob/observer/eye)) // For AI eyes and the like else if(istype(viewer,/mob/observer/eye)) // For AI eyes and the like
var/mob/observer/eye/E = viewer var/mob/observer/eye/E = viewer
if(E.owner && E.owner.client) if(E.owner && E.owner.client)
receivers |= E.owner.client receivers |= E.owner.client
// Admins with RLOOC displayed who weren't already in // Admins with RLOOC displayed who weren't already in
for(var/client/admin in admins) for(var/client/admin in admins)
if(!(admin in receivers) && admin.is_preference_enabled(/datum/client_preference/holder/show_rlooc)) if(!(admin in receivers) && admin.is_preference_enabled(/datum/client_preference/holder/show_rlooc))
r_receivers |= admin r_receivers |= admin
// Send a message // Send a message
for(var/client/target in receivers) for(var/client/target in receivers)
var/admin_stuff = "" var/admin_stuff = ""
if(target in admins) if(target in admins)
admin_stuff += "/([key])" admin_stuff += "/([key])"
to_chat(target, "<span class='ooc looc'>" + create_text_tag("looc", "LOOC:", target) + " <EM>[display_name][admin_stuff]:</EM> <span class='message'>[msg]</span></span>") to_chat(target, "<span class='ooc looc'>" + create_text_tag("looc", "LOOC:", target) + " <EM>[display_name][admin_stuff]:</EM> <span class='message'>[msg]</span></span>")
for(var/client/target in r_receivers) for(var/client/target in r_receivers)
var/admin_stuff = "/([key])([admin_jump_link(mob, target.holder)])" var/admin_stuff = "/([key])([admin_jump_link(mob, target.holder)])"
to_chat(target, "<span class='ooc looc'>" + create_text_tag("looc", "LOOC:", target) + " <span class='prefix'>(R)</span><EM>[display_name][admin_stuff]:</EM> <span class='message'>[msg]</span></span>") to_chat(target, "<span class='ooc looc'>" + create_text_tag("looc", "LOOC:", target) + " <span class='prefix'>(R)</span><EM>[display_name][admin_stuff]:</EM> <span class='message'>[msg]</span></span>")
/mob/proc/get_looc_source() /mob/proc/get_looc_source()
return src return src
/mob/living/silicon/ai/get_looc_source() /mob/living/silicon/ai/get_looc_source()
if(eyeobj) if(eyeobj)
return eyeobj return eyeobj
return src return src

View File

@@ -0,0 +1,22 @@
/client/verb/update_ping(time as num)
set instant = TRUE
set name = ".update_ping"
var/ping = pingfromtime(time)
lastping = ping
if (!avgping)
avgping = ping
else
avgping = MC_AVERAGE_SLOW(avgping, ping)
/client/proc/pingfromtime(time)
return ((world.time+world.tick_lag*world.tick_usage/100)-time)*100
/client/verb/display_ping(time as num)
set instant = TRUE
set name = ".display_ping"
to_chat(src, "<span class='notice'>Round trip ping took [round(pingfromtime(time),1)]ms</span>")
/client/verb/ping()
set name = "Ping"
set category = "OOC"
winset(src, null, "command=.display_ping+[world.time+world.tick_lag*world.tick_usage/100]")

View File

@@ -1,186 +1,190 @@
/client/verb/who() /client/verb/who()
set name = "Who" set name = "Who"
set category = "OOC" set category = "OOC"
var/msg = "<b>Current Players:</b>\n" var/msg = "<b>Current Players:</b>\n"
var/list/Lines = list() var/list/Lines = list()
if(holder && (R_ADMIN & holder.rights || R_MOD & holder.rights)) if(holder && (R_ADMIN & holder.rights || R_MOD & holder.rights))
for(var/client/C in GLOB.clients) for(var/client/C in GLOB.clients)
var/entry = "\t[C.key]" var/entry = "\t[C.key]"
if(C.holder && C.holder.fakekey) if(C.holder && C.holder.fakekey)
entry += " <i>(as [C.holder.fakekey])</i>" entry += " <i>(as [C.holder.fakekey])</i>"
entry += " - Playing as [C.mob.real_name]" entry += " - Playing as [C.mob.real_name]"
switch(C.mob.stat) switch(C.mob.stat)
if(UNCONSCIOUS) if(UNCONSCIOUS)
entry += " - <font color='darkgray'><b>Unconscious</b></font>" entry += " - <font color='darkgray'><b>Unconscious</b></font>"
if(DEAD) if(DEAD)
if(isobserver(C.mob)) if(isobserver(C.mob))
var/mob/observer/dead/O = C.mob var/mob/observer/dead/O = C.mob
if(O.started_as_observer) if(O.started_as_observer)
entry += " - <font color='gray'>Observing</font>" entry += " - <font color='gray'>Observing</font>"
else else
entry += " - <font color='black'><b>DEAD</b></font>" entry += " - <font color='black'><b>DEAD</b></font>"
else else
entry += " - <font color='black'><b>DEAD</b></font>" entry += " - <font color='black'><b>DEAD</b></font>"
var/age var/age
if(isnum(C.player_age)) if(isnum(C.player_age))
age = C.player_age age = C.player_age
else else
age = 0 age = 0
if(age <= 1) if(age <= 1)
age = "<font color='#ff0000'><b>[age]</b></font>" age = "<font color='#ff0000'><b>[age]</b></font>"
else if(age < 10) else if(age < 10)
age = "<font color='#ff8c00'><b>[age]</b></font>" age = "<font color='#ff8c00'><b>[age]</b></font>"
entry += " - [age]" entry += " - [age]"
if(is_special_character(C.mob)) if(is_special_character(C.mob))
entry += " - <b><font color='red'>Antagonist</font></b>" entry += " - <b><font color='red'>Antagonist</font></b>"
if(C.is_afk()) if(C.is_afk())
var/seconds = C.last_activity_seconds() var/seconds = C.last_activity_seconds()
entry += " (AFK - " entry += " (AFK - "
entry += "[round(seconds / 60)] minutes, " entry += "[round(seconds / 60)] minutes, "
entry += "[seconds % 60] seconds)" entry += "[seconds % 60] seconds)"
entry += " (<A HREF='?_src_=holder;adminmoreinfo=\ref[C.mob]'>?</A>)" entry += " (<A HREF='?_src_=holder;adminmoreinfo=\ref[C.mob]'>?</A>)"
Lines += entry entry += " ([round(C.avgping, 1)]ms)"
else Lines += entry
for(var/client/C in GLOB.clients) else
if(C.holder && C.holder.fakekey) for(var/client/C in GLOB.clients)
Lines += C.holder.fakekey var/entry
else if(C.holder && C.holder.fakekey)
Lines += C.key entry = C.holder.fakekey
else
for(var/line in sortList(Lines)) entry = C.key
msg += "[line]\n" entry += " ([round(C.avgping, 1)]ms)"
Lines += entry
msg += "<b>Total Players: [length(Lines)]</b>"
to_chat(src,msg) for(var/line in sortList(Lines))
msg += "[line]\n"
/client/verb/staffwho()
set category = "Admin" msg += "<b>Total Players: [length(Lines)]</b>"
set name = "Staffwho" to_chat(src,msg)
var/msg = "" /client/verb/staffwho()
var/modmsg = "" set category = "Admin"
var/devmsg = "" set name = "Staffwho"
var/eventMmsg = ""
var/num_mods_online = 0 var/msg = ""
var/num_admins_online = 0 var/modmsg = ""
var/num_devs_online = 0 var/devmsg = ""
var/num_event_managers_online = 0 var/eventMmsg = ""
if(holder) var/num_mods_online = 0
for(var/client/C in admins) var/num_admins_online = 0
if(R_ADMIN & C.holder.rights || (!R_MOD & C.holder.rights && !R_EVENT & C.holder.rights)) //Used to determine who shows up in admin rows var/num_devs_online = 0
var/num_event_managers_online = 0
if(C.holder.fakekey && (!R_ADMIN & holder.rights && !R_MOD & holder.rights)) //Event Managerss can't see stealthmins if(holder)
continue for(var/client/C in admins)
if(R_ADMIN & C.holder.rights || (!R_MOD & C.holder.rights && !R_EVENT & C.holder.rights)) //Used to determine who shows up in admin rows
msg += "\t[C] is a [C.holder.rank]"
if(C.holder.fakekey && (!R_ADMIN & holder.rights && !R_MOD & holder.rights)) //Event Managerss can't see stealthmins
if(C.holder.fakekey) continue
msg += " <i>(as [C.holder.fakekey])</i>"
msg += "\t[C] is a [C.holder.rank]"
if(isobserver(C.mob))
msg += " - Observing" if(C.holder.fakekey)
else if(istype(C.mob,/mob/new_player)) msg += " <i>(as [C.holder.fakekey])</i>"
msg += " - Lobby"
else if(isobserver(C.mob))
msg += " - Playing" msg += " - Observing"
else if(istype(C.mob,/mob/new_player))
if(C.is_afk()) msg += " - Lobby"
var/seconds = C.last_activity_seconds() else
msg += " (AFK - " msg += " - Playing"
msg += "[round(seconds / 60)] minutes, "
msg += "[seconds % 60] seconds)" if(C.is_afk())
msg += "\n" var/seconds = C.last_activity_seconds()
msg += " (AFK - "
num_admins_online++ msg += "[round(seconds / 60)] minutes, "
else if(R_MOD & C.holder.rights) //Who shows up in mod rows. msg += "[seconds % 60] seconds)"
modmsg += "\t[C] is a [C.holder.rank]" msg += "\n"
if(isobserver(C.mob)) num_admins_online++
modmsg += " - Observing" else if(R_MOD & C.holder.rights) //Who shows up in mod rows.
else if(istype(C.mob,/mob/new_player)) modmsg += "\t[C] is a [C.holder.rank]"
modmsg += " - Lobby"
else if(isobserver(C.mob))
modmsg += " - Playing" modmsg += " - Observing"
else if(istype(C.mob,/mob/new_player))
if(C.is_afk()) modmsg += " - Lobby"
var/seconds = C.last_activity_seconds() else
modmsg += " (AFK - " modmsg += " - Playing"
modmsg += "[round(seconds / 60)] minutes, "
modmsg += "[seconds % 60] seconds)" if(C.is_afk())
modmsg += "\n" var/seconds = C.last_activity_seconds()
num_mods_online++ modmsg += " (AFK - "
modmsg += "[round(seconds / 60)] minutes, "
else if(R_SERVER & C.holder.rights) modmsg += "[seconds % 60] seconds)"
devmsg += "\t[C] is a [C.holder.rank]" modmsg += "\n"
if(isobserver(C.mob)) num_mods_online++
devmsg += " - Observing"
else if(istype(C.mob,/mob/new_player)) else if(R_SERVER & C.holder.rights)
devmsg += " - Lobby" devmsg += "\t[C] is a [C.holder.rank]"
else if(isobserver(C.mob))
devmsg += " - Playing" devmsg += " - Observing"
else if(istype(C.mob,/mob/new_player))
if(C.is_afk()) devmsg += " - Lobby"
var/seconds = C.last_activity_seconds() else
devmsg += "(AFK - " devmsg += " - Playing"
devmsg += "[round(seconds / 60)] minutes, "
devmsg += "[seconds % 60] seconds)" if(C.is_afk())
devmsg += "\n" var/seconds = C.last_activity_seconds()
num_devs_online++ devmsg += "(AFK - "
devmsg += "[round(seconds / 60)] minutes, "
else if(R_EVENT & C.holder.rights) devmsg += "[seconds % 60] seconds)"
eventMmsg += "\t[C] is a [C.holder.rank]" devmsg += "\n"
if(isobserver(C.mob)) num_devs_online++
eventMmsg += " - Observing"
else if(istype(C.mob,/mob/new_player)) else if(R_EVENT & C.holder.rights)
eventMmsg += " - Lobby" eventMmsg += "\t[C] is a [C.holder.rank]"
else if(isobserver(C.mob))
eventMmsg += " - Playing" eventMmsg += " - Observing"
else if(istype(C.mob,/mob/new_player))
if(C.is_afk()) eventMmsg += " - Lobby"
var/seconds = C.last_activity_seconds() else
eventMmsg += " (AFK - " eventMmsg += " - Playing"
eventMmsg += "[round(seconds / 60)] minutes, "
eventMmsg += "[seconds % 60] seconds)" if(C.is_afk())
eventMmsg += "\n" var/seconds = C.last_activity_seconds()
num_event_managers_online++ eventMmsg += " (AFK - "
eventMmsg += "[round(seconds / 60)] minutes, "
else eventMmsg += "[seconds % 60] seconds)"
for(var/client/C in admins) eventMmsg += "\n"
if(R_ADMIN & C.holder.rights || (!R_MOD & C.holder.rights && !R_EVENT & C.holder.rights)) num_event_managers_online++
if(!C.holder.fakekey)
msg += "\t[C] is a [C.holder.rank]\n" else
num_admins_online++ for(var/client/C in admins)
else if (R_MOD & C.holder.rights) if(R_ADMIN & C.holder.rights || (!R_MOD & C.holder.rights && !R_EVENT & C.holder.rights))
modmsg += "\t[C] is a [C.holder.rank]\n" if(!C.holder.fakekey)
num_mods_online++ msg += "\t[C] is a [C.holder.rank]\n"
else if (R_SERVER & C.holder.rights) num_admins_online++
devmsg += "\t[C] is a [C.holder.rank]\n" else if (R_MOD & C.holder.rights)
num_devs_online++ modmsg += "\t[C] is a [C.holder.rank]\n"
else if (R_EVENT & C.holder.rights) num_mods_online++
eventMmsg += "\t[C] is a [C.holder.rank]\n" else if (R_SERVER & C.holder.rights)
num_event_managers_online++ devmsg += "\t[C] is a [C.holder.rank]\n"
num_devs_online++
if(config.admin_irc) else if (R_EVENT & C.holder.rights)
to_chat(src, "<span class='info'>Adminhelps are also sent to IRC. If no admins are available in game try anyway and an admin on IRC may see it and respond.</span>") eventMmsg += "\t[C] is a [C.holder.rank]\n"
msg = "<b>Current Admins ([num_admins_online]):</b>\n" + msg num_event_managers_online++
if(config.show_mods) if(config.admin_irc)
msg += "\n<b> Current Moderators ([num_mods_online]):</b>\n" + modmsg to_chat(src, "<span class='info'>Adminhelps are also sent to IRC. If no admins are available in game try anyway and an admin on IRC may see it and respond.</span>")
msg = "<b>Current Admins ([num_admins_online]):</b>\n" + msg
if(config.show_devs)
msg += "\n<b> Current Developers ([num_devs_online]):</b>\n" + devmsg if(config.show_mods)
msg += "\n<b> Current Moderators ([num_mods_online]):</b>\n" + modmsg
if(config.show_event_managers)
msg += "\n<b> Current Event Managers ([num_event_managers_online]):</b>\n" + eventMmsg if(config.show_devs)
msg += "\n<b> Current Developers ([num_devs_online]):</b>\n" + devmsg
to_chat(src,msg)
if(config.show_event_managers)
msg += "\n<b> Current Event Managers ([num_event_managers_online]):</b>\n" + eventMmsg
to_chat(src,msg)

View File

@@ -627,6 +627,8 @@
if(.) if(.)
if(statpanel("Status")) if(statpanel("Status"))
if(client)
stat(null, "Ping: [round(client.lastping, 1)]ms (Average: [round(client.avgping, 1)]ms)")
stat(null, "Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)") stat(null, "Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)")
if(ticker && ticker.current_state != GAME_STATE_PREGAME) if(ticker && ticker.current_state != GAME_STATE_PREGAME)
stat("Station Time", stationtime2text()) stat("Station Time", stationtime2text())

View File

@@ -235,6 +235,7 @@
#include "code\controllers\subsystems\orbits.dm" #include "code\controllers\subsystems\orbits.dm"
#include "code\controllers\subsystems\overlays.dm" #include "code\controllers\subsystems\overlays.dm"
#include "code\controllers\subsystems\persistence.dm" #include "code\controllers\subsystems\persistence.dm"
#include "code\controllers\subsystems\ping.dm"
#include "code\controllers\subsystems\planets.dm" #include "code\controllers\subsystems\planets.dm"
#include "code\controllers\subsystems\radiation.dm" #include "code\controllers\subsystems\radiation.dm"
#include "code\controllers\subsystems\shuttles.dm" #include "code\controllers\subsystems\shuttles.dm"
@@ -1335,11 +1336,7 @@
#include "code\game\turfs\unsimulated\planetary.dm" #include "code\game\turfs\unsimulated\planetary.dm"
#include "code\game\turfs\unsimulated\shuttle.dm" #include "code\game\turfs\unsimulated\shuttle.dm"
#include "code\game\turfs\unsimulated\walls.dm" #include "code\game\turfs\unsimulated\walls.dm"
#include "code\game\verbs\advanced_who.dm"
#include "code\game\verbs\ignore.dm"
#include "code\game\verbs\ooc.dm"
#include "code\game\verbs\suicide.dm" #include "code\game\verbs\suicide.dm"
#include "code\game\verbs\who.dm"
#include "code\js\byjax.dm" #include "code\js\byjax.dm"
#include "code\js\menus.dm" #include "code\js\menus.dm"
#include "code\modules\admin\admin.dm" #include "code\modules\admin\admin.dm"
@@ -1462,8 +1459,8 @@
#include "code\modules\ai\ai_holder_targeting.dm" #include "code\modules\ai\ai_holder_targeting.dm"
#include "code\modules\ai\interfaces.dm" #include "code\modules\ai\interfaces.dm"
#include "code\modules\ai\say_list.dm" #include "code\modules\ai\say_list.dm"
#include "code\modules\ai\aI_holder_subtypes\simple_mob_ai.dm" #include "code\modules\ai\ai_holder_subtypes\simple_mob_ai.dm"
#include "code\modules\ai\aI_holder_subtypes\slime_xenobio_ai.dm" #include "code\modules\ai\ai_holder_subtypes\slime_xenobio_ai.dm"
#include "code\modules\alarm\alarm.dm" #include "code\modules\alarm\alarm.dm"
#include "code\modules\alarm\alarm_handler.dm" #include "code\modules\alarm\alarm_handler.dm"
#include "code\modules\alarm\atmosphere_alarm.dm" #include "code\modules\alarm\atmosphere_alarm.dm"
@@ -1581,6 +1578,11 @@
#include "code\modules\client\preference_setup\traits\trait_defines.dm" #include "code\modules\client\preference_setup\traits\trait_defines.dm"
#include "code\modules\client\preference_setup\traits\traits.dm" #include "code\modules\client\preference_setup\traits\traits.dm"
#include "code\modules\client\preference_setup\volume_sliders\01_volume.dm" #include "code\modules\client\preference_setup\volume_sliders\01_volume.dm"
#include "code\modules\client\verbs\advanced_who.dm"
#include "code\modules\client\verbs\ignore.dm"
#include "code\modules\client\verbs\ooc.dm"
#include "code\modules\client\verbs\ping.dm"
#include "code\modules\client\verbs\who.dm"
#include "code\modules\clothing\chameleon.dm" #include "code\modules\clothing\chameleon.dm"
#include "code\modules\clothing\clothing.dm" #include "code\modules\clothing\clothing.dm"
#include "code\modules\clothing\clothing_accessories.dm" #include "code\modules\clothing\clothing_accessories.dm"