diff --git a/code/controllers/master.dm b/code/controllers/master.dm
index d445cf6f3b6..13a2a065a02 100644
--- a/code/controllers/master.dm
+++ b/code/controllers/master.dm
@@ -62,7 +62,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
/// For scheduling different subsystems for different stages of the round
var/current_runlevel
/// Do we want to sleep until players log in?
- var/sleep_offline_after_initializations = TRUE
+ var/sleep_offline_after_initializations = FALSE // No we dont
var/static/restart_clear = 0
var/static/restart_timeout = 0
diff --git a/code/game/verbs/switch_server.dm b/code/game/verbs/switch_server.dm
new file mode 100644
index 00000000000..6fc07b8f684
--- /dev/null
+++ b/code/game/verbs/switch_server.dm
@@ -0,0 +1,49 @@
+/client/verb/switch_server()
+ set name = "Switch Server"
+ set desc = "Switch to a different Paradise server"
+ set category = "OOC"
+
+ // First get our peers
+ var/datum/db_query/dbq1 = SSdbcore.NewQuery({"
+ SELECT server_id, key_name, key_value FROM instance_data_cache WHERE server_id IN
+ (SELECT server_id FROM instance_data_cache WHERE
+ key_name='heartbeat' AND last_updated BETWEEN NOW() - INTERVAL 60 SECOND AND NOW())
+ AND key_name IN ("playercount", "server_port", "server_name")"})
+ if(!dbq1.warn_execute())
+ qdel(dbq1)
+ return
+
+ var/servers_outer = list()
+ while(dbq1.NextRow())
+ if(!servers_outer[dbq1.item[1]])
+ servers_outer[dbq1.item[1]] = list()
+
+ servers_outer[dbq1.item[1]][dbq1.item[2]] = dbq1.item[3] // This should assoc load our data
+
+ // Format the server names into an assoc list of K: name V: port
+ var/list/formatted_servers = list()
+ for(var/server in servers_outer)
+ var/server_data = servers_outer[server]
+ formatted_servers["[server_data["server_name"]] - ([server_data["playercount"]] playing)"] = text2num(server_data["server_port"])
+
+ if(length(formatted_servers) == 1)
+ to_chat(usr, "You are already connected to the one online instance!")
+ return
+
+ var/selected_server = input(usr, "Select a server", "Server hop") as anything in formatted_servers
+ if(!selected_server)
+ return // Should never happen
+
+ if(formatted_servers[selected_server] == world.port)
+ to_chat(usr, "You are already connected to this instance!")
+ return
+
+ // Now we reconnect them
+ to_chat(usr, "Now connecting you to: [selected_server]")
+
+ if(watchlisted) // I mean why not
+ message_admins("[key_name_admin(usr)] is on the watchlist and just jumped to [selected_server]")
+
+ // Formulate a connection URL
+ var/target = "byond://[world.internet_address]:[formatted_servers[selected_server]]"
+ src << link(target)
diff --git a/code/modules/admin/verbs/view_instances.dm b/code/modules/admin/verbs/view_instances.dm
index bbef0b184dc..65d6105da3a 100644
--- a/code/modules/admin/verbs/view_instances.dm
+++ b/code/modules/admin/verbs/view_instances.dm
@@ -7,20 +7,27 @@
return
to_chat(usr, "Server instances info")
- to_chat(usr, "AA you need to finish this you lazy oaf")
- /*
- for(var/datum/peer_server/PS in GLOB.configuration.instancing.peers)
- // We havnt even been discovered, so we cant even be online
- if(!PS.discovered)
- to_chat(usr, "#[PS.server_port] (Undiscovered) - OFFLINE")
- continue
+ var/datum/db_query/dbq1 = SSdbcore.NewQuery({"
+ SELECT server_id, key_name, key_value FROM instance_data_cache WHERE server_id IN
+ (SELECT server_id FROM instance_data_cache WHERE
+ key_name='heartbeat' AND last_updated BETWEEN NOW() - INTERVAL 60 SECOND AND NOW())
+ AND key_name IN ("playercount")"})
+ if(!dbq1.warn_execute())
+ qdel(dbq1)
+ return
- // We exist but arent online at the moment
- if(!PS.online)
- to_chat(usr, "ID [PS.server_id] - OFFLINE")
- continue
+ var/servers_outer = list()
+ while(dbq1.NextRow())
+ if(!servers_outer[dbq1.item[1]])
+ servers_outer[dbq1.item[1]] = list()
- // If we are here, we are online, so we can do a rich report
- to_chat(usr, "ID [PS.server_id] - ONLINE (Players: [PS.playercount])")
- */
+ servers_outer[dbq1.item[1]][dbq1.item[2]] = dbq1.item[3] // This should assoc load our data
+ qdel(dbq1)
+
+ for(var/server in servers_outer)
+ var/server_data = servers_outer[server]
+ var/players = text2num(server_data["playercount"])
+
+ to_chat(usr, "[server] - [players] player[players == 1 ? "" : "s"] online.")
+ to_chat(usr, "Offline instances are not reported")
diff --git a/paradise.dme b/paradise.dme
index 0b2b1346c29..259a5eac574 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1162,6 +1162,7 @@
#include "code\game\verbs\ooc.dm"
#include "code\game\verbs\randomtip.dm"
#include "code\game\verbs\suicide.dm"
+#include "code\game\verbs\switch_server.dm"
#include "code\game\verbs\webmap.dm"
#include "code\game\verbs\who.dm"
#include "code\modules\admin\admin.dm"