From f042d974482c9fc3606cf2743c42f0b094a19b39 Mon Sep 17 00:00:00 2001 From: Jordie Date: Sat, 27 May 2017 06:17:44 +1000 Subject: [PATCH] Adds round table to replace tacking some data in feedback table (#27454) * adds round table to replace tacking some data in feedback table * removes obsolete code for acolytes_survived * uses a better query * corrects var name * uses actual sql queries * adds commit column and connected checks before queries --- SQL/database_changelog.txt | 20 +++++++++++++ SQL/tgstation_schema.sql | 23 +++++++++++++++ SQL/tgstation_schema_prefixed.sql | 23 +++++++++++++++ code/__DEFINES/subsystems.dm | 1 + code/controllers/subsystem/blackbox.dm | 2 -- code/controllers/subsystem/dbcore.dm | 29 +++++++++++-------- code/controllers/subsystem/mapping.dm | 4 ++- code/controllers/subsystem/ticker.dm | 14 +++++---- code/controllers/subsystem/vote.dm | 4 +-- code/game/gamemodes/blob/blob_finish.dm | 6 ++-- code/game/gamemodes/clock_cult/clock_cult.dm | 6 ++-- code/game/gamemodes/cult/cult.dm | 17 +++-------- code/game/gamemodes/game_mode.dm | 16 ++++++---- code/game/gamemodes/gang/gang.dm | 4 +-- code/game/gamemodes/meteor/meteor.dm | 4 +-- .../gamemodes/miniantags/monkey/monkey.dm | 6 ++-- code/game/gamemodes/nuclear/nuclear.dm | 20 ++++++------- code/game/gamemodes/nuclear/nuclearbomb.dm | 2 +- code/game/gamemodes/revolution/revolution.dm | 4 +-- code/game/gamemodes/wizard/raginmages.dm | 2 +- code/game/gamemodes/wizard/wizard.dm | 2 +- code/modules/admin/admin.dm | 4 +-- code/modules/shuttle/emergency.dm | 4 ++- code/world.dm | 16 +++++----- 24 files changed, 151 insertions(+), 82 deletions(-) diff --git a/SQL/database_changelog.txt b/SQL/database_changelog.txt index d0546da131d1..d28b33a8eb63 100644 --- a/SQL/database_changelog.txt +++ b/SQL/database_changelog.txt @@ -1,3 +1,23 @@ +20 May 2017, by Jordie0608 + +Created table `round` to replace tracking of the datapoints 'round_start', 'round_end', 'server_ip', 'game_mode', 'round_end_results', 'end_error', 'end_proper', 'emergency_shuttle', 'map_name' and 'station_renames' in the `feedback` table. +Once created this table is populated with rows from the `feedback` table. + +START TRANSACTION; +CREATE TABLE `feedback`.`round` (`id` INT(11) NOT NULL AUTO_INCREMENT, `start_datetime` DATETIME NOT NULL, `end_datetime` DATETIME NULL, `server_ip` INT(10) UNSIGNED NOT NULL, `server_port` SMALLINT(5) UNSIGNED NOT NULL, `commit_hash` CHAR(40) NULL, `game_mode` VARCHAR(32) NULL, `game_mode_result` VARCHAR(64) NULL, `end_state` VARCHAR(64) NULL, `shuttle_name` VARCHAR(64) NULL, `map_name` VARCHAR(32) NULL, `station_name` VARCHAR(80) NULL, PRIMARY KEY (`id`)); +INSERT INTO `feedback`.`round` +(`id`, `start_datetime`, `end_datetime`, `server_ip`, `server_port`, `commit_hash`, `game_mode`, `game_mode_result`, `end_state`, `shuttle_name`, `map_name`, `station_name`) +SELECT DISTINCT ri.round_id, IFNULL(STR_TO_DATE(st.details,'%a %b %e %H:%i:%s %Y'), TIMESTAMP(0)), STR_TO_DATE(et.details,'%a %b %e %H:%i:%s %Y'), IFNULL(INET_ATON(SUBSTRING_INDEX(IF(si.details = '', '0', IF(SUBSTRING_INDEX(si.details, ':', 1) LIKE '%_._%', si.details, '0')), ':', 1)), INET_ATON(0)), IFNULL(IF(si.details LIKE '%:_%', CAST(SUBSTRING_INDEX(si.details, ':', -1) AS UNSIGNED), '0'), '0'), ch.details, gm.details, mr.details, IFNULL(es.details, ep.details), ss.details, mn.details, sn.details +FROM `feedback`.`feedback`AS ri +LEFT JOIN `feedback`.`feedback` AS st ON ri.round_id = st.round_id AND st.var_name = "round_start" LEFT JOIN `feedback`.`feedback` AS et ON ri.round_id = et.round_id AND et.var_name = "round_end" LEFT JOIN `feedback`.`feedback` AS si ON ri.round_id = si.round_id AND si.var_name = "server_ip" LEFT JOIN `feedback`.`feedback` AS ch ON ri.round_id = ch.round_id AND ch.var_name = "revision" LEFT JOIN `feedback`.`feedback` AS gm ON ri.round_id = gm.round_id AND gm.var_name = "game_mode" LEFT JOIN `feedback`.`feedback` AS mr ON ri.round_id = mr.round_id AND mr.var_name = "round_end_result" LEFT JOIN `feedback`.`feedback` AS es ON ri.round_id = es.round_id AND es.var_name = "end_state" LEFT JOIN `feedback`.`feedback` AS ep ON ri.round_id = ep.round_id AND ep.var_name = "end_proper" LEFT JOIN `feedback`.`feedback` AS ss ON ri.round_id = ss.round_id AND ss.var_name = "emergency_shuttle" LEFT JOIN `feedback`.`feedback` AS mn ON ri.round_id = mn.round_id AND mn.var_name = "map_name" LEFT JOIN `feedback`.`feedback` AS sn ON ri.round_id = sn.round_id AND sn.var_name = "station_renames"; +COMMIT; + +It's not necessary to delete the rows from the `feedback` table but henceforth these datapoints will be in the `round` table. + +Remember to add a prefix to the table names if you use them + +---------------------------------------------------- + 21 April 2017, by Jordie0608 Modified table 'player', adding the column 'accountjoindate', removing the column 'id' and making the column 'ckey' the primary key. diff --git a/SQL/tgstation_schema.sql b/SQL/tgstation_schema.sql index 73e2d465f3da..46729fc9bbf5 100644 --- a/SQL/tgstation_schema.sql +++ b/SQL/tgstation_schema.sql @@ -362,6 +362,29 @@ CREATE TABLE `poll_vote` ( KEY `idx_pvote_optionid_ckey` (`optionid`,`ckey`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `round` +-- +DROP TABLE IF EXISTS `round`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `round` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `start_datetime` DATETIME NOT NULL, + `end_datetime` DATETIME NULL, + `server_ip` INT(10) UNSIGNED NOT NULL, + `server_port` SMALLINT(5) UNSIGNED NOT NULL, + `commit_hash` CHAR(40) NULL, + `game_mode` VARCHAR(32) NULL, + `game_mode_result` VARCHAR(64) NULL, + `end_state` VARCHAR(64) NULL, + `shuttle_name` VARCHAR(64) NULL, + `map_name` VARCHAR(32) NULL, + `station_name` VARCHAR(80) NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; diff --git a/SQL/tgstation_schema_prefixed.sql b/SQL/tgstation_schema_prefixed.sql index 4d74b9deaab4..f717bf96adbc 100644 --- a/SQL/tgstation_schema_prefixed.sql +++ b/SQL/tgstation_schema_prefixed.sql @@ -362,6 +362,29 @@ CREATE TABLE `SS13_poll_vote` ( KEY `idx_pvote_optionid_ckey` (`optionid`,`ckey`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `SS13_round` +-- +DROP TABLE IF EXISTS `SS13_round`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `SS13_round` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `start_datetime` DATETIME NOT NULL, + `end_datetime` DATETIME NULL, + `server_ip` INT(10) UNSIGNED NOT NULL, + `server_port` SMALLINT(5) UNSIGNED NOT NULL, + `commit_hash` CHAR(40) NULL, + `game_mode` VARCHAR(32) NULL, + `game_mode_result` VARCHAR(64) NULL, + `end_state` VARCHAR(64) NULL, + `shuttle_name` VARCHAR(64) NULL, + `map_name` VARCHAR(32) NULL, + `station_name` VARCHAR(80) NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 3f5349cfacca..f0bd42b32039 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -41,6 +41,7 @@ // Subsystems shutdown in the reverse of the order they initialize in // The numbers just define the ordering, they are meaningless otherwise. +#define INIT_ORDER_DBCORE 17 #define INIT_ORDER_SERVER_MAINT 16 #define INIT_ORDER_JOBS 15 #define INIT_ORDER_EVENTS 14 diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm index 79872131aae1..9a08d75988ab 100644 --- a/code/controllers/subsystem/blackbox.dm +++ b/code/controllers/subsystem/blackbox.dm @@ -82,8 +82,6 @@ SUBSYSTEM_DEF(blackbox) add_details("radio_usage","PDA-[pda_msg_amt]") add_details("radio_usage","RC-[rc_msg_amt]") - set_details("round_end","[time2text(world.realtime)]") //This one MUST be the last one that gets set. - if (!SSdbcore.Connect()) return diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm index cf3efc3bc3b2..b052b20f5d02 100644 --- a/code/controllers/subsystem/dbcore.dm +++ b/code/controllers/subsystem/dbcore.dm @@ -1,7 +1,7 @@ SUBSYSTEM_DEF(dbcore) name = "Database" flags = SS_NO_INIT|SS_NO_FIRE - + init_order = INIT_ORDER_DBCORE var/const/FAILED_DB_CONNECTION_CUTOFF = 5 var/const/Default_Cursor = 0 @@ -30,6 +30,11 @@ SUBSYSTEM_DEF(dbcore) _db_con = SSdbcore._db_con /datum/controller/subsystem/dbcore/Shutdown() + //This is as close as we can get to the true round end before Disconnect() without changing where it's called, defeating the reason this is a subsystem + if(SSdbcore.Connect()) + var/sql_station_name = sanitizeSQL(station_name()) + var/datum/DBQuery/query_round_end = SSdbcore.NewQuery("INSERT INTO [format_table_name("round")] (end_datetime, game_mode_result, end_state, station_name) VALUES (Now(), '[SSticker.mode_result]', '[SSticker.end_state]', '[sql_station_name]') WHERE id = [GLOB.round_id]") + query_round_end.Execute() if(IsConnected()) Disconnect() @@ -48,7 +53,7 @@ SUBSYSTEM_DEF(dbcore) if(failed_connections > FAILED_DB_CONNECTION_CUTOFF) //If it failed to establish a connection more than 5 times in a row, don't bother attempting to connect anymore. return FALSE - + if(!config.sql_enabled) return FALSE @@ -171,16 +176,16 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table var/_db_query /datum/DBQuery/New(sql_query, datum/controller/subsystem/dbcore/connection_handler, cursor_handler) - if(sql_query) + if(sql_query) sql = sql_query - if(connection_handler) + if(connection_handler) db_connection = connection_handler - if(cursor_handler) + if(cursor_handler) default_cursor = cursor_handler item = list() _db_query = _dm_db_new_query() -/datum/DBQuery/proc/Connect(datum/controller/subsystem/dbcore/connection_handler) +/datum/DBQuery/proc/Connect(datum/controller/subsystem/dbcore/connection_handler) db_connection = connection_handler /datum/DBQuery/proc/warn_execute() @@ -194,16 +199,16 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table if(!. && log_error) log_sql("[ErrorMsg()] | Query used: [sql]") -/datum/DBQuery/proc/NextRow() +/datum/DBQuery/proc/NextRow() return _dm_db_next_row(_db_query,item,conversions) /datum/DBQuery/proc/RowsAffected() return _dm_db_rows_affected(_db_query) -/datum/DBQuery/proc/RowCount() +/datum/DBQuery/proc/RowCount() return _dm_db_row_count(_db_query) -/datum/DBQuery/proc/ErrorMsg() +/datum/DBQuery/proc/ErrorMsg() return _dm_db_error_msg(_db_query) /datum/DBQuery/proc/Columns() @@ -232,11 +237,11 @@ Delayed insert mode was removed in mysql 7 and only works with MyISAM type table return db_connection.Quote(str) /datum/DBQuery/proc/SetConversion(column,conversion) - if(istext(column)) + if(istext(column)) column = columns.Find(column) - if(!conversions) + if(!conversions) conversions = list(column) - else if(conversions.len < column) + else if(conversions.len < column) conversions.len = column conversions[column] = conversion diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 6dde8e6b2d3e..9c2f3d284582 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -119,7 +119,9 @@ SUBSYSTEM_DEF(mapping) INIT_ANNOUNCE("Loading [config.map_name]...") TryLoadZ(config.GetFullMapPath(), FailedZs, ZLEVEL_STATION) INIT_ANNOUNCE("Loaded station in [(REALTIMEOFDAY - start_time)/10]s!") - SSblackbox.add_details("map_name", config.map_name) + if(SSdbcore.Connect()) + var/datum/DBQuery/query_round_map_name = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET map_name = '[config.map_name]' WHERE id = [GLOB.round_id]") + query_round_map_name.Execute() if(config.minetype != "lavaland") INIT_ANNOUNCE("WARNING: A map without lavaland set as it's minetype was loaded! This is being ignored! Update the maploader code!") diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 1ade9be24710..de161ddecf4d 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -60,6 +60,8 @@ SUBSYSTEM_DEF(ticker) var/round_start_time = 0 var/list/round_start_events + var/mode_result = "undefined" + var/end_state = "undefined" /datum/controller/subsystem/ticker/Initialize(timeofday) load_mode() @@ -618,9 +620,9 @@ SUBSYSTEM_DEF(ticker) sleep(50) if(mode.station_was_nuked) - Reboot("Station destroyed by Nuclear Device.", "end_proper", "nuke") + Reboot("Station destroyed by Nuclear Device.", "nuke") else - Reboot("Round ended.", "end_proper", "proper completion") + Reboot("Round ended.", "proper completion") /datum/controller/subsystem/ticker/proc/send_tip_of_the_round() var/m @@ -814,7 +816,7 @@ SUBSYSTEM_DEF(ticker) C.Export("##action=load_rsc", round_end_sound) round_end_sound_sent = TRUE -/datum/controller/subsystem/ticker/proc/Reboot(reason, feedback_c, feedback_r, delay) +/datum/controller/subsystem/ticker/proc/Reboot(reason, end_string, delay) set waitfor = FALSE if(usr && !check_rights(R_SERVER, TRUE)) return @@ -825,7 +827,7 @@ SUBSYSTEM_DEF(ticker) if(delay_end) to_chat(world, "An admin has delayed the round end.") return - + to_chat(world, "Rebooting World in [delay/10] [(delay >= 10 && delay < 20) ? "second" : "seconds"]. [reason]") var/start_wait = world.time @@ -835,8 +837,8 @@ SUBSYSTEM_DEF(ticker) if(delay_end) to_chat(world, "Reboot was cancelled by an admin.") return - - SSblackbox.set_details("[feedback_c]","[feedback_r]") + if(end_string) + end_state = end_string log_game("Rebooting World. [reason]") diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 05c45988ca47..7c560c89f81d 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -3,7 +3,7 @@ SUBSYSTEM_DEF(vote) wait = 10 flags = SS_KEEP_TIMING|SS_NO_INIT - + runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT var/initiator = null @@ -130,7 +130,7 @@ SUBSYSTEM_DEF(vote) active_admins = 1 break if(!active_admins) - SSticker.Reboot("Restart vote successful.", "end_error", "restart vote") + SSticker.Reboot("Restart vote successful.", "restart vote") else to_chat(world, "Notice:Restart vote will not restart the server automatically because there are active admins on.") message_admins("A restart vote has passed, but there are active admins on with +server, so it has been canceled. If you wish, you may restart the server.") diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm index ab94f94afd23..3ca2e8f00ede 100644 --- a/code/game/gamemodes/blob/blob_finish.dm +++ b/code/game/gamemodes/blob/blob_finish.dm @@ -20,7 +20,7 @@ if(round_converted) //So badmin blobs later don't step on the dead natural blobs metaphorical toes ..() if(blobwincount <= GLOB.blobs_legit.len) - SSblackbox.set_details("round_end_result","win - blob took over") + SSticker.mode_result = "win - blob took over" to_chat(world, "The blob has taken over the station!") to_chat(world, "The entire station was eaten by the Blob!") log_game("Blob mode completed with a blob victory.") @@ -28,7 +28,7 @@ SSticker.news_report = BLOB_WIN else if(station_was_nuked) - SSblackbox.set_details("round_end_result","halfwin - nuke") + SSticker.mode_result = "halfwin - nuke" to_chat(world, "Partial Win: The station has been destroyed!") to_chat(world, "Directive 7-12 has been successfully carried out, preventing the Blob from spreading.") log_game("Blob mode completed with a tie (station destroyed).") @@ -36,7 +36,7 @@ SSticker.news_report = BLOB_NUKE else if(!GLOB.blob_cores.len) - SSblackbox.set_details("round_end_result","loss - blob eliminated") + SSticker.mode_result = "loss - blob eliminated" to_chat(world, "The staff has won!") to_chat(world, "The alien organism has been eradicated from the station!") log_game("Blob mode completed with a crew victory.") diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 132c834f1083..48e1ff19576e 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -191,7 +191,7 @@ Credit where due: var/datum/game_mode/clockwork_cult/C = SSticker.mode if(C.check_clockwork_victory()) text += "Ratvar's servants have succeeded in fulfilling His goals!" - SSblackbox.set_details("round_end_result", "win - servants completed their objective (summon ratvar)") + SSticker.mode_result = "win - servants completed their objective (summon ratvar)" else var/half_victory = FALSE var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = locate() in GLOB.all_clockwork_objects @@ -200,10 +200,10 @@ Credit where due: if(half_victory) text += "The crew escaped before Ratvar could rise, but the gateway \ was successfully constructed!" - SSblackbox.set_details("round_end_result", "halfwin - servants constructed the gateway but their objective was not completed (summon ratvar)") + SSticker.mode_result = "halfwin - servants constructed the gateway but their objective was not completed (summon ratvar)" else text += "Ratvar's servants have failed!" - SSblackbox.set_details("round_end_result", "loss - servants failed their objective (summon ratvar)") + SSticker.mode_result = "loss - servants failed their objective (summon ratvar)" text += "
The servants' objective was:
[CLOCKCULT_OBJECTIVE]" text += "
Ratvar's servants had [GLOB.clockwork_caches] Tinkerer's Caches." text += "
Construction Value(CV) was: [GLOB.clockwork_construction_value]" diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 90e477695ba2..31fcfea19e5e 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -208,12 +208,10 @@ /datum/game_mode/cult/declare_completion() if(!check_cult_victory()) - SSblackbox.set_details("round_end_result","win - cult win") - SSblackbox.set_val("round_end_result",acolytes_survived) + SSticker.mode_result = "win - cult win" to_chat(world, "The cult has succeeded! Nar-sie has snuffed out another torch in the void!") else - SSblackbox.set_details("round_end_result","loss - staff stopped the cult") - SSblackbox.set_val("round_end_result",acolytes_survived) + SSticker.mode_result = "loss - staff stopped the cult" to_chat(world, "The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!") var/text = "" @@ -257,22 +255,15 @@ /datum/game_mode/proc/datum_cult_completion() var/text = "" - var/acolytes_survived = 0 - for(var/datum/mind/cult_mind in cult) - if (cult_mind.current && cult_mind.current.stat != DEAD) - if(cult_mind.current.onCentcom() || cult_mind.current.onSyndieBase()) - acolytes_survived++ var/cult_fail = 0 cult_fail += eldergod if(!GLOB.sac_complete) cult_fail++ if(!cult_fail) - SSblackbox.set_details("round_end_result","win - cult win") - SSblackbox.set_val("round_end_result",acolytes_survived) + SSticker.mode_result = "win - cult win" to_chat(world, "The cult has succeeded! Nar-sie has snuffed out another torch in the void!") else - SSblackbox.set_details("round_end_result","loss - staff stopped the cult") - SSblackbox.set_val("round_end_result",acolytes_survived) + SSticker.mode_result = "loss - staff stopped the cult" to_chat(world, "The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!") if(cult_objectives.len) text += "
The cultists' objectives were:" diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 348526abdec5..098d40b8e6e5 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -80,11 +80,17 @@ report = config.intercept addtimer(CALLBACK(GLOBAL_PROC, .proc/display_roundstart_logout_report), ROUNDSTART_LOGOUT_REPORT_TIME) - SSblackbox.set_details("round_start","[time2text(world.realtime)]") - if(SSticker && SSticker.mode) - SSblackbox.set_details("game_mode","[SSticker.mode]") - if(GLOB.revdata.commit) - SSblackbox.set_details("revision","[GLOB.revdata.commit]") + if(SSdbcore.Connect()) + var/sql + if(SSticker && SSticker.mode) + sql += "game_mode = '[SSticker.mode]'" + if(sql) + sql += ", " + if(GLOB.revdata.commit) + sql += "commit_hash = '[GLOB.revdata.commit]'" + if(sql) + var/datum/DBQuery/query_round_game_mode = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET [sql] WHERE id = [GLOB.round_id]") + query_round_game_mode.Execute() if(report) addtimer(CALLBACK(src, .proc/send_intercept, 0), rand(waittime_l, waittime_h)) generate_station_goals() diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm index f32fc80d611d..6606a0d87181 100644 --- a/code/game/gamemodes/gang/gang.dm +++ b/code/game/gamemodes/gang/gang.dm @@ -288,12 +288,12 @@ GLOBAL_LIST_INIT(gang_outfit_pool, list(/obj/item/clothing/suit/jacket/leather,/ return if(!winner) to_chat(world, "The station was [station_was_nuked ? "destroyed!" : "evacuated before a gang could claim it! The station wins!"]
") - SSblackbox.set_details("round_end_result","loss - gangs failed takeover") + SSticker.mode_result = "loss - gangs failed takeover" SSticker.news_report = GANG_LOSS else to_chat(world, "The [winner.name] Gang successfully performed a hostile takeover of the station!
") - SSblackbox.set_details("round_end_result","win - gang domination complete") + SSticker.mode_result = "win - gang domination complete" SSticker.news_report = GANG_TAKEOVER diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index d0cd7c05203b..0b20694b580e 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -50,8 +50,6 @@ else to_chat(world, "Nobody survived the meteor storm!") - SSblackbox.set_details("round_end_result","end - evacuation") - SSblackbox.set_val("round_end_result",survivors) - + SSticker.mode_result = "end - evacuation" ..() return 1 diff --git a/code/game/gamemodes/miniantags/monkey/monkey.dm b/code/game/gamemodes/miniantags/monkey/monkey.dm index f9ea8dcc2cb1..20ba54afc46f 100644 --- a/code/game/gamemodes/miniantags/monkey/monkey.dm +++ b/code/game/gamemodes/miniantags/monkey/monkey.dm @@ -107,10 +107,8 @@ /datum/game_mode/monkey/declare_completion() if(check_monkey_victory()) - SSblackbox.set_details("round_end_result","win - monkey win") - SSblackbox.set_val("round_end_result",escaped_monkeys) + SSticker.mode_result = "win - monkey win" to_chat(world, "The monkeys have overthrown their captors! Eeek eeeek!!") else - SSblackbox.set_details("round_end_result","loss - staff stopped the monkeys") - SSblackbox.set_val("round_end_result",escaped_monkeys) + SSticker.mode_result = "loss - staff stopped the monkeys" to_chat(world, "The staff managed to contain the monkey infestation!") diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 6af3e86b7ecf..14a5ffcd5eaa 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -201,70 +201,70 @@ if(nuke_off_station == NUKE_SYNDICATE_BASE) - SSblackbox.set_details("round_end_result","loss - syndicate nuked - disk secured") + SSticker.mode_result = "loss - syndicate nuked - disk secured" to_chat(world, "Humiliating Syndicate Defeat") to_chat(world, "The crew of [station_name()] gave [syndicate_name()] operatives back their bomb! The syndicate base was destroyed! Next time, don't lose the nuke!") SSticker.news_report = NUKE_SYNDICATE_BASE else if(!disk_rescued && station_was_nuked && !syndies_didnt_escape) - SSblackbox.set_details("round_end_result","win - syndicate nuke") + SSticker.mode_result = "win - syndicate nuke" to_chat(world, "Syndicate Major Victory!") to_chat(world, "[syndicate_name()] operatives have destroyed [station_name()]!") SSticker.news_report = STATION_NUKED else if (!disk_rescued && station_was_nuked && syndies_didnt_escape) - SSblackbox.set_details("round_end_result","halfwin - syndicate nuke - did not evacuate in time") + SSticker.mode_result = "halfwin - syndicate nuke - did not evacuate in time" to_chat(world, "Total Annihilation") to_chat(world, "[syndicate_name()] operatives destroyed [station_name()] but did not leave the area in time and got caught in the explosion. Next time, don't lose the disk!") SSticker.news_report = STATION_NUKED else if (!disk_rescued && !station_was_nuked && nuke_off_station && !syndies_didnt_escape) - SSblackbox.set_details("round_end_result","halfwin - blew wrong station") + SSticker.mode_result = "halfwin - blew wrong station" to_chat(world, "Crew Minor Victory") to_chat(world, "[syndicate_name()] operatives secured the authentication disk but blew up something that wasn't [station_name()]. Next time, don't do that!") SSticker.news_report = NUKE_MISS else if (!disk_rescued && !station_was_nuked && nuke_off_station && syndies_didnt_escape) - SSblackbox.set_details("round_end_result","halfwin - blew wrong station - did not evacuate in time") + SSticker.mode_result = "halfwin - blew wrong station - did not evacuate in time" to_chat(world, "[syndicate_name()] operatives have earned Darwin Award!") to_chat(world, "[syndicate_name()] operatives blew up something that wasn't [station_name()] and got caught in the explosion. Next time, don't do that!") SSticker.news_report = NUKE_MISS else if ((disk_rescued || SSshuttle.emergency.mode != SHUTTLE_ENDGAME) && are_operatives_dead()) - SSblackbox.set_details("round_end_result","loss - evacuation - disk secured - syndi team dead") + SSticker.mode_result = "loss - evacuation - disk secured - syndi team dead" to_chat(world, "Crew Major Victory!") to_chat(world, "The Research Staff has saved the disk and killed the [syndicate_name()] Operatives") SSticker.news_report = OPERATIVES_KILLED else if (disk_rescued) - SSblackbox.set_details("round_end_result","loss - evacuation - disk secured") + SSticker.mode_result = "loss - evacuation - disk secured" to_chat(world, "Crew Major Victory") to_chat(world, "The Research Staff has saved the disk and stopped the [syndicate_name()] Operatives!") SSticker.news_report = OPERATIVES_KILLED else if (!disk_rescued && are_operatives_dead()) - SSblackbox.set_details("round_end_result","halfwin - evacuation - disk not secured") + SSticker.mode_result = "halfwin - evacuation - disk not secured" to_chat(world, "Neutral Victory!") to_chat(world, "The Research Staff failed to secure the authentication disk but did manage to kill most of the [syndicate_name()] Operatives!") SSticker.news_report = OPERATIVE_SKIRMISH else if (!disk_rescued && crew_evacuated) - SSblackbox.set_details("round_end_result","halfwin - detonation averted") + SSticker.mode_result = "halfwin - detonation averted" to_chat(world, "Syndicate Minor Victory!") to_chat(world, "[syndicate_name()] operatives survived the assault but did not achieve the destruction of [station_name()]. Next time, don't lose the disk!") SSticker.news_report = OPERATIVE_SKIRMISH else if (!disk_rescued && !crew_evacuated) - SSblackbox.set_details("round_end_result","halfwin - interrupted") + SSticker.mode_result = "halfwin - interrupted" to_chat(world, "Neutral Victory") to_chat(world, "Round was mysteriously interrupted!") diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 5964983b0950..0cad439948ec 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -459,7 +459,7 @@ var/datum/game_mode/nuclear/NM = SSticker.mode NM.nukes_left -- if(!SSticker.mode.check_finished())//If the mode does not deal with the nuke going off so just reboot because everyone is stuck as is - SSticker.Reboot("Station destroyed by Nuclear Device.", "end_error", "nuke - unhandled ending") + SSticker.Reboot("Station destroyed by Nuclear Device.", "nuke - unhandled ending") /* diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 7a31d1f3cdf7..5cfdb11087cb 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -345,13 +345,13 @@ ////////////////////////////////////////////////////////////////////// /datum/game_mode/revolution/declare_completion() if(finished == 1) - SSblackbox.set_details("round_end_result","win - heads killed") + SSticker.mode_result = "win - heads killed" to_chat(world, "The heads of staff were killed or exiled! The revolutionaries win!") SSticker.news_report = REVS_WIN else if(finished == 2) - SSblackbox.set_details("round_end_result","loss - rev heads killed") + SSticker.mode_result = "loss - rev heads killed" to_chat(world, "The heads of staff managed to stop the revolution!") SSticker.news_report = REVS_LOSE diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm index dd69d77b14cd..d8bf34c99e92 100644 --- a/code/game/gamemodes/wizard/raginmages.dm +++ b/code/game/gamemodes/wizard/raginmages.dm @@ -133,7 +133,7 @@ /datum/game_mode/wizard/raginmages/declare_completion() if(finished) - SSblackbox.set_details("round_end_result","loss - wizard killed") + SSticker.mode_result = "loss - wizard killed" to_chat(world, "The crew has managed to hold off the wizard attack! The Space Wizards Federation has been taught a lesson they will not soon forget!") ..(1) diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 38bf76b12a3b..eb53620899fd 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -180,7 +180,7 @@ /datum/game_mode/wizard/declare_completion() if(finished) - SSblackbox.set_details("round_end_result","loss - wizard killed") + SSticker.mode_result = "loss - wizard killed" to_chat(world, "The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!") SSticker.news_report = WIZARD_KILLED diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 3371914bb836..cb46f8ef2003 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -428,11 +428,11 @@ SSblackbox.add_details("admin_verb","Reboot World") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! switch(result) if("Regular Restart") - SSticker.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "end_error", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", 10) + SSticker.Reboot("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key].", "admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]", 10) if("Hard Restart (No Delay, No Feeback Reason)") world.Reboot() if("Hardest Restart (No actions, just reboot)") - world.Reboot(fast_track = TRUE) + world.Reboot(fast_track = TRUE) /datum/admins/proc/end_round() set category = "Server" diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index d479ddf1bc55..e1ed63793d3a 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -297,7 +297,9 @@ setTimer(SSshuttle.emergencyDockTime) send2irc("Server", "The Emergency Shuttle has docked with the station.") priority_announce("The Emergency Shuttle has docked with the station. You have [timeLeft(600)] minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg', "Priority") - SSblackbox.add_details("emergency_shuttle", src.name) + if(SSdbcore.Connect()) + var/datum/DBQuery/query_round_shuttle_name = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET shuttle_name = '[name]' WHERE id = [GLOB.round_id]") + query_round_shuttle_name.Execute() // Gangs only have one attempt left if the shuttle has // docked with the station to prevent suffering from diff --git a/code/world.dm b/code/world.dm index 6e3f4d79843c..f1e70b1f7ad4 100644 --- a/code/world.dm +++ b/code/world.dm @@ -56,12 +56,12 @@ if(config.sql_enabled) if(SSdbcore.Connect()) log_world("Database connection established.") - var/datum/DBQuery/query_feedback_create_round = SSdbcore.NewQuery("INSERT INTO [format_table_name("feedback")] SELECT null, Now(), IFNULL(MAX(round_id),0)+1, \"server_ip\", 0, \"[world.internet_address]:[world.port]\" FROM [format_table_name("feedback")]") - query_feedback_create_round.Execute() - var/datum/DBQuery/query_feedback_max_id = SSdbcore.NewQuery("SELECT MAX(round_id) FROM [format_table_name("feedback")]") - query_feedback_max_id.Execute() - if(query_feedback_max_id.NextRow()) - GLOB.round_id = query_feedback_max_id.item[1] + var/datum/DBQuery/query_round_start = SSdbcore.NewQuery("INSERT INTO [format_table_name("round")] (start_datetime, server_ip, server_port) VALUES (Now(), INET_ATON('[world.internet_address]'), '[world.port]')") + query_round_start.Execute() + var/datum/DBQuery/query_round_last_id = SSdbcore.NewQuery("SELECT LAST_INSERT_ID()") + query_round_last_id.Execute() + if(query_round_last_id.NextRow()) + GLOB.round_id = query_round_last_id.item[1] else log_world("Your server failed to establish a connection with the database.") @@ -82,7 +82,7 @@ if(fexists(GLOB.config_error_log)) fcopy(GLOB.config_error_log, "[GLOB.log_directory]/config_error.log") fdel(GLOB.config_error_log) - + if(GLOB.round_id) log_game("Round ID: [GLOB.round_id]") @@ -224,7 +224,7 @@ else to_chat(world, "Rebooting world...") Master.Shutdown() //run SS shutdowns - log_world("World rebooted at [time_stamp()]"); + log_world("World rebooted at [time_stamp()]") ..() /world/proc/load_motd()