diff --git a/code/__defines/subsystems.dm b/code/__defines/subsystems.dm
index d0a5d72c86f..0f927bb4946 100644
--- a/code/__defines/subsystems.dm
+++ b/code/__defines/subsystems.dm
@@ -57,7 +57,10 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G
#define INIT_ORDER_SKYBOX 30
#define INIT_ORDER_MAPPING 25
#define INIT_ORDER_DECALS 20
+<<<<<<< HEAD
#define INIT_ORDER_PLANTS 18 // Must initialize before atoms.
+=======
+>>>>>>> ebc5263... Merge pull request #7920 from Atermonera/ping_verb_fix
#define INIT_ORDER_JOB 17
#define INIT_ORDER_ALARM 16 // Must initialize before atoms.
#define INIT_ORDER_ATOMS 15
diff --git a/code/game/verbs/advanced_who.dm b/code/game/verbs/advanced_who.dm
index 4498136b2b3..221939cd50c 100644
--- a/code/game/verbs/advanced_who.dm
+++ b/code/game/verbs/advanced_who.dm
@@ -85,6 +85,10 @@
entry += " - In Lobby
"
else
entry += " - Playing
"
+<<<<<<< HEAD:code/game/verbs/advanced_who.dm
+=======
+
+>>>>>>> ebc5263... Merge pull request #7920 from Atermonera/ping_verb_fix:code/modules/client/verbs/advanced_who.dm
Lines += entry
msg += "
"
diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm
index 3cb25b702e4..5c6f1e15452 100644
--- a/code/game/verbs/who.dm
+++ b/code/game/verbs/who.dm
@@ -1,3 +1,4 @@
+<<<<<<< HEAD:code/game/verbs/who.dm
/client/verb/who()
set name = "Who"
@@ -206,3 +207,193 @@
msg += "\nAdminhelps are also sent to Discord. If no admins are available in game try anyway and an admin on Discord may see it and respond."
return msg
+=======
+
+/client/verb/who()
+ set name = "Who"
+ set category = "OOC"
+
+ var/msg = "Current Players:\n"
+
+ var/list/Lines = list()
+
+ if(holder && (R_ADMIN & holder.rights || R_MOD & holder.rights))
+ for(var/client/C in GLOB.clients)
+ var/entry = "\t[C.key]"
+ if(C.holder && C.holder.fakekey)
+ entry += " (as [C.holder.fakekey])"
+ entry += " - Playing as [C.mob.real_name]"
+ switch(C.mob.stat)
+ if(UNCONSCIOUS)
+ entry += " - Unconscious"
+ if(DEAD)
+ if(isobserver(C.mob))
+ var/mob/observer/dead/O = C.mob
+ if(O.started_as_observer)
+ entry += " - Observing"
+ else
+ entry += " - DEAD"
+ else
+ entry += " - DEAD"
+
+ var/age
+ if(isnum(C.player_age))
+ age = C.player_age
+ else
+ age = 0
+
+ if(age <= 1)
+ age = "[age]"
+ else if(age < 10)
+ age = "[age]"
+
+ entry += " - [age]"
+
+ if(is_special_character(C.mob))
+ entry += " - Antagonist"
+
+ if(C.is_afk())
+ var/seconds = C.last_activity_seconds()
+ entry += " (AFK - "
+ entry += "[round(seconds / 60)] minutes, "
+ entry += "[seconds % 60] seconds)"
+
+ entry += " (?)"
+ Lines += entry
+ else
+ for(var/client/C in GLOB.clients)
+ var/entry
+ if(C.holder && C.holder.fakekey)
+ entry = C.holder.fakekey
+ else
+ entry = C.key
+ Lines += entry
+
+ for(var/line in sortList(Lines))
+ msg += "[line]\n"
+
+ msg += "Total Players: [length(Lines)]"
+ to_chat(src,msg)
+
+/client/verb/staffwho()
+ set category = "Admin"
+ set name = "Staffwho"
+
+ var/msg = ""
+ var/modmsg = ""
+ var/devmsg = ""
+ var/eventMmsg = ""
+ var/num_mods_online = 0
+ var/num_admins_online = 0
+ var/num_devs_online = 0
+ var/num_event_managers_online = 0
+ if(holder)
+ 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
+
+ if(C.holder.fakekey && (!R_ADMIN & holder.rights && !R_MOD & holder.rights)) //Event Managerss can't see stealthmins
+ continue
+
+ msg += "\t[C] is a [C.holder.rank]"
+
+ if(C.holder.fakekey)
+ msg += " (as [C.holder.fakekey])"
+
+ if(isobserver(C.mob))
+ msg += " - Observing"
+ else if(istype(C.mob,/mob/new_player))
+ msg += " - Lobby"
+ else
+ msg += " - Playing"
+
+ if(C.is_afk())
+ var/seconds = C.last_activity_seconds()
+ msg += " (AFK - "
+ msg += "[round(seconds / 60)] minutes, "
+ msg += "[seconds % 60] seconds)"
+ msg += "\n"
+
+ num_admins_online++
+ else if(R_MOD & C.holder.rights) //Who shows up in mod rows.
+ modmsg += "\t[C] is a [C.holder.rank]"
+
+ if(isobserver(C.mob))
+ modmsg += " - Observing"
+ else if(istype(C.mob,/mob/new_player))
+ modmsg += " - Lobby"
+ else
+ modmsg += " - Playing"
+
+ if(C.is_afk())
+ var/seconds = C.last_activity_seconds()
+ modmsg += " (AFK - "
+ modmsg += "[round(seconds / 60)] minutes, "
+ modmsg += "[seconds % 60] seconds)"
+ modmsg += "\n"
+ num_mods_online++
+
+ else if(R_SERVER & C.holder.rights)
+ devmsg += "\t[C] is a [C.holder.rank]"
+ if(isobserver(C.mob))
+ devmsg += " - Observing"
+ else if(istype(C.mob,/mob/new_player))
+ devmsg += " - Lobby"
+ else
+ devmsg += " - Playing"
+
+ if(C.is_afk())
+ var/seconds = C.last_activity_seconds()
+ devmsg += "(AFK - "
+ devmsg += "[round(seconds / 60)] minutes, "
+ devmsg += "[seconds % 60] seconds)"
+ devmsg += "\n"
+ num_devs_online++
+
+ else if(R_EVENT & C.holder.rights)
+ eventMmsg += "\t[C] is a [C.holder.rank]"
+ if(isobserver(C.mob))
+ eventMmsg += " - Observing"
+ else if(istype(C.mob,/mob/new_player))
+ eventMmsg += " - Lobby"
+ else
+ eventMmsg += " - Playing"
+
+ if(C.is_afk())
+ var/seconds = C.last_activity_seconds()
+ eventMmsg += " (AFK - "
+ eventMmsg += "[round(seconds / 60)] minutes, "
+ eventMmsg += "[seconds % 60] seconds)"
+ eventMmsg += "\n"
+ num_event_managers_online++
+
+ else
+ for(var/client/C in admins)
+ if(R_ADMIN & C.holder.rights || (!R_MOD & C.holder.rights && !R_EVENT & C.holder.rights))
+ if(!C.holder.fakekey)
+ msg += "\t[C] is a [C.holder.rank]\n"
+ num_admins_online++
+ else if (R_MOD & C.holder.rights)
+ modmsg += "\t[C] is a [C.holder.rank]\n"
+ num_mods_online++
+ else if (R_SERVER & C.holder.rights)
+ devmsg += "\t[C] is a [C.holder.rank]\n"
+ num_devs_online++
+ else if (R_EVENT & C.holder.rights)
+ eventMmsg += "\t[C] is a [C.holder.rank]\n"
+ num_event_managers_online++
+
+ if(config.admin_irc)
+ to_chat(src, "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.")
+ msg = "Current Admins ([num_admins_online]):\n" + msg
+
+ if(config.show_mods)
+ msg += "\n Current Moderators ([num_mods_online]):\n" + modmsg
+
+ if(config.show_devs)
+ msg += "\n Current Developers ([num_devs_online]):\n" + devmsg
+
+ if(config.show_event_managers)
+ msg += "\n Current Event Managers ([num_event_managers_online]):\n" + eventMmsg
+
+ to_chat(src,msg)
+>>>>>>> ebc5263... Merge pull request #7920 from Atermonera/ping_verb_fix:code/modules/client/verbs/who.dm
diff --git a/code/modules/client/verbs/ping.dm b/code/modules/client/verbs/ping.dm
new file mode 100644
index 00000000000..8213daa7505
--- /dev/null
+++ b/code/modules/client/verbs/ping.dm
@@ -0,0 +1,12 @@
+/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, "Round trip ping took [round(pingfromtime(time),1)]ms")
+
+/client/verb/ping()
+ set name = "Ping"
+ set category = "OOC"
+ winset(src, null, "command=.display_ping+[world.time+world.tick_lag*world.tick_usage/100]")
\ No newline at end of file