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"