diff --git a/.github/USING_FEEDBACK_DATA.md b/.github/USING_FEEDBACK_DATA.md new file mode 100644 index 00000000000..889c14e5ff9 --- /dev/null +++ b/.github/USING_FEEDBACK_DATA.md @@ -0,0 +1,205 @@ +# Using Feedback Data + +## Introduction + +`Feedback` is the name of the data storage system used for logging game statistics to the database. It is managed by `SSblackbox` and can be recorded in many formats. This guide will contain information on how to record feedback data properly, as well as what should and should not be recorded. + +## Things you should and should not record + +Feedback data can be useful, depending on how you use it. You need to be careful with what you record to make sure you are not saving useless data. Examples of good things to record: + +- Antagonist win/loss rates if a new gamemode or antagonist is being added +- Department performance (IE: Slime cores produced in science) +- Basically anything which has actual meaning + +Examples of bad things to record: + +- Amount of times a wrench is used (Why) +- Hours spent on the server (We have other means of that) +- Basically, just think about it and ask yourself "Is this actually useful to base game design around" + +Also note that feedback data **must** be anonymous. The only exception here is for data *anyone* on the server can see, such as round end antagonist reports. + +## Feedback Data Recording + +Feedback data can be reocrded in 5 formats. `amount`, `associative`, `nested tally`, `tally` and `text`. + +### Amount + +`amount` is the simplest form of feedback data recording. They are simply a numerical number which increase with each feedback increment. For example: + +These DM calls: + +```dm +SSblackbox.record_feedback("amount", "example", 8) +SSblackbox.record_feedback("amount", "example", 2) +// Note that you can use negative increments to decrease the value +``` + +Will produce the following JSON: + +```json +{ + "data":10 +} +``` + +Notice the lack of any specific identification other than it being the value of the `data` key. Amounts are designed to be simple with minimal complexity, and are useful for logging statistics such as how many times one specific, distinct action is done (e.g.: How many MMIs have been filled). If you want to log multiple similar things (e.g.: How many mechas have been created, broken down by the mecha type), use a `tally` with a sub-key for each different mecha, instead of an amount with its own key per mecha. + +### Associative + +`associative` is used to record text that's associated with multiple key-value pairs. (e.g: coordinates). Further calls to the same key will append a new list to existing data. For example: + +```dm +SSblackbox.record_feedback("associative", "example", 1, list("text" = "example", "path" = /obj/item, "number" = 4)) +SSblackbox.record_feedback("associative", "example", 1, list("number" = 7, "text" = "example", "other text" = "sample")) +``` + +Will produce the following JSON: + +```json +{ + "data":{ + "1":{ + "text":"example", + "path":"/obj/item", + "number":"4" + }, + "2":{ + "number":"7", + "text":"example", + "other text":"sample" + } + } +} +``` + +Notice how everything is cast to strings, and each new entry added has its index increased ("1", "2", etc). Also take note how the `increment` parameter is not used here. It does nothing to the data, and `1` is used just as the value for consistency. + +### Nested Tally + +`nested tally` is used to track the number of occurances of structured semi-relational values (e.g.: the results of arcade machines). You can think of it as a running total, with the key being a list of strings (rather than a single string), with elements incrementally identifying the entity in question. + +Technically, the values are nested in a multi-dimensional array. The final element in the data list is used as the tracking key, and all prior elements are used for nesting. Further calls to the same key will add or subtract from the saved value of the data key if it already exists in the same multi-dimensional position, and append the key and it's value if it doesn't exist already. This one is quite complicated, but an example is below: + +```dm +SSblackbox.record_feedback("nested tally", "example", 1, list("fruit", "orange", "apricot")) +SSblackbox.record_feedback("nested tally", "example", 2, list("fruit", "orange", "orange")) +SSblackbox.record_feedback("nested tally", "example", 3, list("fruit", "orange", "apricot")) +SSblackbox.record_feedback("nested tally", "example", 10, list("fruit", "red", "apple")) +SSblackbox.record_feedback("nested tally", "example", 1, list("vegetable", "orange", "carrot")) +``` + +Will produce the following JSON: + +```json +{ + "data":{ + "fruit":{ + "orange":{ + "apricot":4, + "orange":2 + }, + "red":{ + "apple":10 + } + }, + "vegetable":{ + "orange":{ + "carrot":1 + } + } + } +} +``` + +#### NOTE + +Tracking values associated with a number can't merge with a nesting value, trying to do so will append the list + +```dm +SSblackbox.record_feedback("nested tally", "example", 3, list("fruit", "orange")) +``` + +Will produce the following JSON: + +```json +{ + "data":{ + "fruit":{ + "orange":{ + "apricot":4, + "orange":2 + }, + "red":{ + "apple":10 + }, + "orange":3 + }, + "vegetable":{ + "orange":{ + "carrot":1 + } + } + } +} +``` + +Avoid doing this, since having duplicate keys in JSON (data.fruit.orange) will break when parsing. + +### Tally + +`tally` is used to track the number of occurances of multiple related values (e.g.: how many times each type of gun is fired). Further calls to the same key will add or subtract from the saved value of the data key if it already exists, and append the key and it's value if it doesn't exist. + +```dm +SSblackbox.record_feedback("tally", "example", 1, "sample data") +SSblackbox.record_feedback("tally", "example", 4, "sample data") +SSblackbox.record_feedback("tally", "example", 2, "other data") +``` + +Will produce the following JSON: + +```json +{ + "data":{ + "sample data":5, + "other data":2 + } +} +``` + +### Text + +`text` is used for simple single-string records (e.g.: the current chaplain religion). Further calls to the same key will append saved data unless the overwrite argument is true or it already exists. When encoded, calls made with overwrite will lack square brackets. + +```dm +SSblackbox.record_feedback("text", "example", 1, "sample text") +SSblackbox.record_feedback("text", "example", 1, "other text") +SSblackbox.record_feedback("text", "example", 1, "sample text") +``` + +Will produce the following JSON: + +```json +{ + "data":[ + "sample text", + "other text" + ] +} +``` + +Note how `"sample text"` only appears once. `text` is a set with no duplicates, instead of a list with duplicates. Also take note how the `increment` parameter is not used here. It does nothing to the data, and `1` is used just as the value for consistency. + +## Feedback Versioning + +If the logging content (i.e.: What data is logged) for a variable is ever changed, the version needs bumping. This can be done with the `versions` list on the subsystem definition itself. All values default to `1`. + +```dm +var/list/versions = list( + "round_end_stats" = 4, + "admin_toggle" = 2, + "gun_fired" = 2) +``` + +If you are doing a type change (i.e.: Changing from a `tally` to a `nested tally`), **USE AN ENTIRELY NEW KEY NAME**. diff --git a/SQL/paradise_schema.sql b/SQL/paradise_schema.sql index 73240b31b4a..10d9514eabf 100644 --- a/SQL/paradise_schema.sql +++ b/SQL/paradise_schema.sql @@ -112,6 +112,33 @@ CREATE TABLE `customuseritems` ( ) ENGINE=MyISAM AUTO_INCREMENT=56 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Table structure for table `death` +-- + +DROP TABLE IF EXISTS `death`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `death` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `pod` text NOT NULL COMMENT 'Place of death', + `coord` text NOT NULL COMMENT 'X, Y, Z POD', + `tod` datetime NOT NULL COMMENT 'Time of death', + `job` text NOT NULL, + `special` text NOT NULL, + `name` text NOT NULL, + `byondkey` text NOT NULL, + `laname` text NOT NULL COMMENT 'Last attacker name', + `lakey` text NOT NULL COMMENT 'Last attacker key', + `gender` text NOT NULL, + `bruteloss` int(11) NOT NULL, + `brainloss` int(11) NOT NULL, + `fireloss` int(11) NOT NULL, + `oxyloss` int(11) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=166546 DEFAULT CHARSET=utf8mb4; +/*!40101 SET character_set_client = @saved_cs_client */; + -- -- Table structure for table `donators` -- @@ -206,6 +233,25 @@ CREATE TABLE `ban` ( ) ENGINE=InnoDB AUTO_INCREMENT=58903 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Table structure for table `feedback` +-- + +DROP TABLE IF EXISTS `feedback`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `feedback` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `datetime` datetime NOT NULL, + `round_id` int(8) NOT NULL, + `key_name` varchar(32) NOT NULL, + `key_type` enum('text', 'amount', 'tally', 'nested tally', 'associative') NOT NULL, + `version` tinyint(3) UNSIGNED NOT NULL, + `json` LONGTEXT NOT NULL COLLATE 'utf8mb4_general_ci', + PRIMARY KEY (`id`) +) ENGINE=MyISAM AUTO_INCREMENT=257638 DEFAULT CHARSET=utf8mb4; +/*!40101 SET character_set_client = @saved_cs_client */; + -- -- Table structure for table `player` -- diff --git a/SQL/updates/34-35.sql b/SQL/updates/34-35.sql deleted file mode 100644 index 921db0fba20..00000000000 --- a/SQL/updates/34-35.sql +++ /dev/null @@ -1,7 +0,0 @@ -# Removes unneeded tables used for SSblackbox in favor of logging. - -# Drop feedback table -DROP TABLE `feedback`; - -# Drop death table -DROP TABLE `death`; diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index ab82ee9ef67..f3729973265 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -363,7 +363,7 @@ #define EXPLOSION_BLOCK_PROC -1 // The SQL version required by this version of the code -#define SQL_VERSION 35 +#define SQL_VERSION 34 // Vending machine stuff #define CAT_NORMAL 1 diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 8463e9850d7..2e06c7645f1 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -67,9 +67,10 @@ // Subsystems shutdown in the reverse of the order they initialize in // The numbers just define the ordering, they are meaningless otherwise. #define INIT_ORDER_TITLE 100 // This **MUST** load first or people will se blank lobby screens -#define INIT_ORDER_SPEECH_CONTROLLER 18 -#define INIT_ORDER_GARBAGE 17 -#define INIT_ORDER_DBCORE 16 +#define INIT_ORDER_SPEECH_CONTROLLER 19 +#define INIT_ORDER_GARBAGE 18 +#define INIT_ORDER_DBCORE 17 +#define INIT_ORDER_BLACKBOX 16 #define INIT_ORDER_CLEANUP 15 #define INIT_ORDER_INPUT 14 #define INIT_ORDER_SOUNDS 13 diff --git a/code/controllers/master.dm b/code/controllers/master.dm index a151e0dfd05..0dc7aa070a7 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -329,6 +329,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new var/time = rustg_time_milliseconds(SS_INIT_TIMER_KEY) var/seconds = round(time / 1000, 0.01) + // Always update the blackbox tally regardless. + SSblackbox.record_feedback("tally", "subsystem_initialize", time, subsystem.name) // Gave invalid return value. if(result && !(result in valid_results)) diff --git a/code/controllers/subsystem/chat.dm b/code/controllers/subsystem/chat.dm index 4a0f469b6e4..9a1674f35fb 100644 --- a/code/controllers/subsystem/chat.dm +++ b/code/controllers/subsystem/chat.dm @@ -96,3 +96,12 @@ SUBSYSTEM_DEF(chat) payload.resends += 1 send_payload_to_client(client, client_history[sequence]) + SSblackbox.record_feedback( + "nested tally", + "chat_resend_byond_version", + 1, + list( + "[client.byond_version]", + "[client.byond_build]", + ), + ) diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm index 26c716c480b..e3c2da658a5 100644 --- a/code/controllers/subsystem/dbcore.dm +++ b/code/controllers/subsystem/dbcore.dm @@ -581,6 +581,7 @@ SUBSYSTEM_DEF(dbcore) log_admin("[key_name(usr)] is attempting to re-establish the DB Connection") message_admins("[key_name_admin(usr)] is attempting to re-establish the DB Connection") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Force Reconnect DB") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! SSdbcore.failed_connections = 0 // Reset this if(!SSdbcore.Connect()) diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm index 945d1a37354..28512ef82e7 100644 --- a/code/controllers/subsystem/jobs.dm +++ b/code/controllers/subsystem/jobs.dm @@ -315,6 +315,8 @@ SUBSYSTEM_DEF(jobs) //Shuffle players and jobs unassigned = shuffle(unassigned) + HandleFeedbackGathering() + if(new_malf) // code to assign malf AI before civs. Debug("DO, Running AI Check") FillMalfAIPosition() @@ -586,6 +588,52 @@ SUBSYSTEM_DEF(jobs) J.spawn_positions = J.positions_lowpop J.total_positions = J.positions_lowpop +/datum/controller/subsystem/jobs/proc/HandleFeedbackGathering() + for(var/datum/job/job in occupations) + + var/high = 0 //high + var/medium = 0 //medium + var/low = 0 //low + var/never = 0 //never + var/banned = 0 //banned + var/young = 0 //account too young + var/charyoung = 0 //character too young + var/disabled = 0 //has disability rendering them ineligible + for(var/mob/new_player/player in GLOB.player_list) + if(!(player.ready && player.mind && !player.mind.assigned_role)) + continue //This player is not ready + if(jobban_isbanned(player, job.title)) + banned++ + continue + if(!job.player_old_enough(player.client)) + young++ + continue + if(job.available_in_playtime(player.client)) + young++ + continue + if(job.barred_by_disability(player.client)) + disabled++ + continue + if(!job.character_old_enough(player.client)) + charyoung++ + continue + if(player.client.prefs.GetJobDepartment(job, 1) & job.flag) + high++ + else if(player.client.prefs.GetJobDepartment(job, 2) & job.flag) + medium++ + else if(player.client.prefs.GetJobDepartment(job, 3) & job.flag) + low++ + else never++ //not selected + + SSblackbox.record_feedback("nested tally", "job_preferences", high, list("[job.title]", "high")) + SSblackbox.record_feedback("nested tally", "job_preferences", medium, list("[job.title]", "medium")) + SSblackbox.record_feedback("nested tally", "job_preferences", low, list("[job.title]", "low")) + SSblackbox.record_feedback("nested tally", "job_preferences", never, list("[job.title]", "never")) + SSblackbox.record_feedback("nested tally", "job_preferences", banned, list("[job.title]", "banned")) + SSblackbox.record_feedback("nested tally", "job_preferences", young, list("[job.title]", "young")) + SSblackbox.record_feedback("nested tally", "job_preferences", disabled, list("[job.title]", "disabled")) + SSblackbox.record_feedback("nested tally", "job_preferences", charyoung, list("[job.title]", "charyoung")) + /datum/controller/subsystem/jobs/proc/CreateMoneyAccount(mob/living/H, rank, datum/job/job) var/money_amount = rand(job.min_start_money, job.max_start_money) diff --git a/code/controllers/subsystem/non-firing/blackbox.dm b/code/controllers/subsystem/non-firing/blackbox.dm new file mode 100644 index 00000000000..a0f16e8055d --- /dev/null +++ b/code/controllers/subsystem/non-firing/blackbox.dm @@ -0,0 +1,315 @@ +// Dont touch this subsystem unless you ABSOLUTELY know what you are doing + +SUBSYSTEM_DEF(blackbox) + name = "Blackbox" + flags = SS_NO_FIRE | SS_NO_INIT + // Even though we dont initialize, we need this init_order + // On Master.Shutdown(), it shuts down subsystems in the REVERSE order + // The database SS has INIT_ORDER_DBCORE=16, and this SS has INIT_ORDER_BLACKBOX=15 + // So putting this ensures it shuts down in the right order + init_order = INIT_ORDER_BLACKBOX + ss_id = "blackbox" + + /// List of all recorded feedback + var/list/datum/feedback_variable/feedback = list() + /// Is it time to stop tracking stats? + var/sealed = FALSE + /// List of highest tech levels attained that isn't lost lost by destruction of RD computers + var/list/research_levels = list() + /// Associative list of any feedback variables that have had their format changed since creation and their current version, remember to update this + var/list/versions = list() + +/datum/controller/subsystem/blackbox/Recover() + feedback = SSblackbox.feedback + sealed = SSblackbox.sealed + +//no touchie +/datum/controller/subsystem/blackbox/can_vv_get(var_name) + if(var_name == NAMEOF(src, feedback)) + return debug_variable(var_name, deepCopyList(feedback), 0, src) + return ..() + +/datum/controller/subsystem/blackbox/vv_edit_var(var_name, var_value) + switch(var_name) + if(NAMEOF(src, feedback)) + return FALSE + if(NAMEOF(src, sealed)) + if(var_value) + return Seal() + return FALSE + return ..() + +/** + * Shutdown Helper + * + * Dumps all feedback stats to the DB. Doesnt get much simpler than that. + */ +/datum/controller/subsystem/blackbox/Shutdown() + sealed = FALSE + for(var/obj/machinery/message_server/MS in GLOB.message_servers) + if(MS.pda_msgs.len) + record_feedback("tally", "radio_usage", MS.pda_msgs.len, "PDA") + if(MS.rc_msgs.len) + record_feedback("tally", "radio_usage", MS.rc_msgs.len, "request console") + + if(length(research_levels)) + record_feedback("associative", "high_research_level", 1, research_levels) + + if(!SSdbcore.IsConnected()) + return + + var/list/datum/db_query/queries = list() + + for(var/datum/feedback_variable/FV in feedback) + var/sqlversion = 1 + if(FV.key in versions) + sqlversion = versions[FV.key] + + var/datum/db_query/query_feedback_save = SSdbcore.NewQuery({" + INSERT DELAYED IGNORE INTO [format_table_name("feedback")] (datetime, round_id, key_name, key_type, version, json) + VALUES (NOW(), :rid, :keyname, :keytype, :version, :json)"}, list( + "rid" = text2num(GLOB.round_id), + "keyname" = FV.key, + "keytype" = FV.key_type, + "version" = text2num(sqlversion), + "json" = json_encode(FV.json) + )) + queries += query_feedback_save + + SSdbcore.MassExecute(queries, TRUE, TRUE) + +/** + * Blackbox Sealer + * + * Seals the blackbox, preventing new data from being stored. This is to avoid data being bloated during end round grief + */ +/datum/controller/subsystem/blackbox/proc/Seal() + if(sealed) + return FALSE + add_game_logs("Blackbox sealed") + sealed = TRUE + return TRUE + +/** + * Research level broadcast logging helper + * + * This is called on R&D updates for a safe way of logging tech levels if an R&D console is destroyed + * + * Arguments: + * * tech - Research technology name + * * level - Research technology level + */ +/datum/controller/subsystem/blackbox/proc/log_research(tech, level) + if(!(tech in research_levels) || research_levels[tech] < level) + research_levels[tech] = level + + +/** + * Radio broadcast logging helper + * + * Called during [/proc/broadcast_message()] to log a message to the blackbox. + * Translates the specific frequency to a name + * + * Arguments: + * * freq - Frequency of the transmission + */ +/datum/controller/subsystem/blackbox/proc/LogBroadcast(freq) + if(sealed) + return + switch(freq) + if(PUB_FREQ) + record_feedback("tally", "radio_usage", 1, "common") + if(SCI_FREQ) + record_feedback("tally", "radio_usage", 1, "science") + if(COMM_FREQ) + record_feedback("tally", "radio_usage", 1, "command") + if(MED_FREQ) + record_feedback("tally", "radio_usage", 1, "medical") + if(ENG_FREQ) + record_feedback("tally", "radio_usage", 1, "engineering") + if(SEC_FREQ) + record_feedback("tally", "radio_usage", 1, "security") + if(DTH_FREQ) + record_feedback("tally", "radio_usage", 1, "deathsquad") + if(SYND_FREQ) + record_feedback("tally", "radio_usage", 1, "syndicate") + if(SYND_TAIPAN_FREQ) + record_feedback("tally", "radio_usage", 1, "syndicate taipan") + if(SYNDTEAM_FREQ) + record_feedback("tally", "radio_usage", 1, "syndicate team") + if(NINJA_FREQ) + record_feedback("tally", "radio_usage", 1, "spider clan") + if(SUP_FREQ) + record_feedback("tally", "radio_usage", 1, "supply") + if(SRV_FREQ) + record_feedback("tally", "radio_usage", 1, "service") + if(PROC_FREQ) + record_feedback("tally", "radio_usage", 1, "procedure") + else + record_feedback("tally", "radio_usage", 1, "other") + + +/** + * Helper to find and return a feeedback datum + * + * Pass in a feedback datum key and key_type to do a lookup. + * It will create the feedback datum if it doesnt exist + * + * Arguments: + * * key - Key of the variable to lookup + * * key_type - Type of feedback to be recorded if the feedback datum cant be found + */ +/datum/controller/subsystem/blackbox/proc/find_feedback_datum(key, key_type) + for(var/datum/feedback_variable/FV in feedback) + if(FV.key == key) + return FV + + var/datum/feedback_variable/FV = new(key, key_type) + feedback += FV + return FV + +/** + * Main feedback recording proc + * + * This is the bulk of this subsystem and is in charge of creating and using the variables. + * See .github/USING_FEEDBACK_DATA.md for instructions + * Note that feedback is not recorded to the DB during this function. That happens at round end. + * + * Arguments: + * * key_type - Type of key. Either "text", "amount", "tally", "nested tally", "associative" + * * key - Key of the data to be used (EG: "admin_verb") + * * increment - If using "amount", how much to increment why + * * data - The actual data to logged + * * overwrite - Do we want to overwrite the existing key + */ +/datum/controller/subsystem/blackbox/proc/record_feedback(key_type, key, increment, data, overwrite) + if(sealed || !key_type || !istext(key) || !isnum(increment || !data)) + return + var/datum/feedback_variable/FV = find_feedback_datum(key, key_type) + switch(key_type) + if("text") + if(!istext(data)) + return + if(!islist(FV.json["data"])) + FV.json["data"] = list() + if(overwrite) + FV.json["data"] = data + else + FV.json["data"] |= data + if("amount") + FV.json["data"] += increment + if("tally") + if(!islist(FV.json["data"])) + FV.json["data"] = list() + FV.json["data"]["[data]"] += increment + if("nested tally") + if(!islist(data)) + return + if(!islist(FV.json["data"])) + FV.json["data"] = list() + FV.json["data"] = record_feedback_recurse_list(FV.json["data"], data, increment) + if("associative") + if(!islist(data)) + return + if(!islist(FV.json["data"])) + FV.json["data"] = list() + var/pos = length(FV.json["data"]) + 1 + FV.json["data"]["[pos]"] = list() + for(var/i in data) + FV.json["data"]["[pos]"]["[i]"] = "[data[i]]" + +/** + * Recursive list recorder + * + * Used by the above proc for nested tallies + * + * Arguments: + * * L - List to use + * * key_list - List of keys to add + * * increment - How much to increase by + * * depth - Depth to use + */ +/datum/controller/subsystem/blackbox/proc/record_feedback_recurse_list(list/L, list/key_list, increment, depth = 1) + if(depth == key_list.len) + if(L.Find(key_list[depth])) + L["[key_list[depth]]"] += increment + else + var/list/list_found_index = list(key_list[depth] = increment) + L += list_found_index + else + if(!L.Find(key_list[depth])) + var/list/list_go_down = list(key_list[depth] = list()) + L += list_go_down + L["[key_list[depth-1]]"] = .(L["[key_list[depth]]"], key_list, increment, ++depth) + return L + +/** + * # feedback_variable + * + * Datum to hold feedback data, which gets logged at round end + * + * Holds all the information being logged + */ +/datum/feedback_variable + var/key + var/key_type + var/list/json = list() + +// Basically just takes some args and sets them +/datum/feedback_variable/New(new_key, new_key_type) + key = new_key + key_type = new_key_type + +/** + * Death reporting proc + * + * Called when humans and cyborgs die, and logs death info to the `death` table + * + * Arguments: + * * L - The human or cyborg to be logged + */ +/datum/controller/subsystem/blackbox/proc/ReportDeath(mob/living/L) + set waitfor = FALSE + if(sealed) + return + if(!SSdbcore.IsConnected()) + return + if(!L) + return + if(!L.key || !L.mind) + return + + var/area/placeofdeath = get_area(L.loc) + var/podname = "Unknown" + if(placeofdeath) + podname = placeofdeath.name + + // Empty string is important here! + var/laname = "" + var/lakey = "" + if(L.lastattacker) + laname = L.lastattacker + if(L.lastattackerckey) + lakey = L.lastattackerckey + + var/datum/db_query/deathquery = SSdbcore.NewQuery({" + INSERT INTO [format_table_name("death")] (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss, coord) + VALUES (:name, :key, :job, :special, :pod, NOW(), :laname, :lakey, :gender, :bruteloss, :fireloss, :brainloss, :oxyloss, :coord)"}, + list( + "name" = L.real_name, + "key" = L.key, + "job" = L.mind.assigned_role, + "special" = L.mind.special_role || "", + "pod" = podname, + "laname" = laname, + "lakey" = lakey, + "gender" = L.gender, + "bruteloss" = L.getBruteLoss(), + "fireloss" = L.getFireLoss(), + "brainloss" = L.getBrainLoss(), + "oxyloss" = L.getOxyLoss(), + "coord" = "[L.x], [L.y], [L.z]" + ) + ) + deathquery.warn_execute() + qdel(deathquery) diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm index b1602ea881f..0dcf1b4908c 100644 --- a/code/controllers/subsystem/shuttles.dm +++ b/code/controllers/subsystem/shuttles.dm @@ -477,6 +477,7 @@ SUBSYSTEM_DEF(shuttle) SSshuttle.initial_load() log_and_message_admins(span_notice("[key_name(usr)] re-registered docking ports for SSshuttle.")) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Re-register Docking Ports") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! #undef CALL_SHUTTLE_REASON_LENGTH diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 279913af849..bbc082fd78c 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -628,6 +628,8 @@ SUBSYSTEM_DEF(ticker) var/mob/M = m H.add_hud_to(M) + // Seal the blackbox, stop collecting info + SSblackbox.Seal() SSdbcore.SetRoundEnd() return TRUE diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index 1b69b02e855..a6cac628303 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -12,8 +12,10 @@ switch(controller) if("Master") Recreate_MC() + SSblackbox.record_feedback("tally", "admin_verb", 1, "Restart MC") if("Failsafe") new /datum/controller/failsafe() + SSblackbox.record_feedback("tally", "admin_verb", 1, "Restart Failsafe") message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.") @@ -27,12 +29,16 @@ switch(controller) if("Configuration") debug_variables(config) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Debug Config") if("pAI") debug_variables(GLOB.paiController) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Debug pAI") if("Cameras") debug_variables(GLOB.cameranet) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Debug Cameras") if("Space Manager") debug_variables(GLOB.space_manager) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Debug Space") message_admins("Admin [key_name_admin(usr)] is debugging the [controller] controller.") @@ -45,6 +51,7 @@ GLOB.npcpool_suspension = !GLOB.npcpool_suspension message_admins("Admin [key_name_admin(usr)] toggled NPCpool suspension.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle NPCpool suspension") /client/proc/toggle_Idlenpcpool_suspension() set category = "Debug" @@ -55,6 +62,7 @@ GLOB.idlenpc_suspension = !GLOB.idlenpc_suspension message_admins("Admin [key_name_admin(usr)] toggled IdleNPCpool suspension.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle IdleNPCpool suspension") /client/proc/toggle_mobs_suspension() set category = "Debug" @@ -65,3 +73,4 @@ GLOB.mob_suspension = !GLOB.mob_suspension message_admins("Admin [key_name_admin(usr)] toggled mobs suspension.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle Mobs suspension") diff --git a/code/datums/components/defibrillator.dm b/code/datums/components/defibrillator.dm index 00bb53ee283..fa90caaf95d 100644 --- a/code/datums/components/defibrillator.dm +++ b/code/datums/components/defibrillator.dm @@ -289,6 +289,7 @@ target.shock_internal_organs(100) SEND_SIGNAL(parent, COMSIG_DEFIB_SHOCK_APPLIED, user, target, should_cause_harm, TRUE) add_attack_logs(user, target, "Revived with [defib_ref]") + SSblackbox.record_feedback("tally", "players_revived", 1, "defibrillator") SEND_SIGNAL(parent, COMSIG_DEFIB_SHOCK_APPLIED, user, target, should_cause_harm, defib_success) set_cooldown(cooldown) busy = FALSE diff --git a/code/datums/spell_handler/vampire_spell_handler.dm b/code/datums/spell_handler/vampire_spell_handler.dm index 61fbaae004e..ad198b149b3 100644 --- a/code/datums/spell_handler/vampire_spell_handler.dm +++ b/code/datums/spell_handler/vampire_spell_handler.dm @@ -65,6 +65,7 @@ if(!vampire) return to_chat(user, span_boldnotice("У Вас осталось [vampire.bloodusable] единиц крови.")) + SSblackbox.record_feedback("tally", "vampire_powers_used", 1, "[spell]") // Only log abilities which require blood /datum/spell_handler/vampire/goon/revert_cast(mob/living/carbon/user, obj/effect/proc_holder/spell/spell) var/datum/antagonist/vampire/vampire = user?.mind?.has_antag_datum(/datum/antagonist/vampire) diff --git a/code/datums/spells/alien_spells/evolve.dm b/code/datums/spells/alien_spells/evolve.dm index e4283923bc2..80f11c6b97f 100644 --- a/code/datums/spells/alien_spells/evolve.dm +++ b/code/datums/spells/alien_spells/evolve.dm @@ -78,6 +78,7 @@ playsound_xenobuild(user.loc) + SSblackbox.record_feedback("tally", "alien_growth", 1, "[new_xeno]") qdel(user) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 5bbb7def5b4..a0aa080ac7a 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -109,6 +109,7 @@ target_uplink.uses -= max(cost, 0) target_uplink.used_TC += cost + SSblackbox.record_feedback("nested tally", "traitor_uplink_items_bought", 1, list("[initial(name)]", "[cost]")) return new item(get_turf(buyer)) diff --git a/code/game/ambitions/ambition_objective.dm b/code/game/ambitions/ambition_objective.dm index 7d2dfea9fdc..753091835c2 100644 --- a/code/game/ambitions/ambition_objective.dm +++ b/code/game/ambitions/ambition_objective.dm @@ -177,11 +177,17 @@ for(var/datum/ambition_objective/objective in employee.ambition_objectives) if(objective.completed) completed_text += "
 - Амбиция №[count]: [objective.description] реализована!" + SSblackbox.record_feedback("nested tally", "employee_objective", 1, list("[objective.type]", "SUCCESS")) ambitions_completed = TRUE + else + SSblackbox.record_feedback("nested tally", "employee_objective", 1, list("[objective.type]", "FAIL")) count++ if (ambitions_completed) text += completed_text text += "
 [employee.name] считает, что реализовал свои амбиции!" + SSblackbox.record_feedback("tally", "employee_success", 1, "SUCCESS") + else + SSblackbox.record_feedback("tally", "employee_success", 1, "FAIL") return text diff --git a/code/game/gamemodes/auto_decrare.dm b/code/game/gamemodes/auto_decrare.dm index 185395b1f27..92eacce2574 100644 --- a/code/game/gamemodes/auto_decrare.dm +++ b/code/game/gamemodes/auto_decrare.dm @@ -22,15 +22,19 @@ for(var/datum/objective/objective in all_objectives) if(objective.check_completion()) text += "
Цель #[count]: [objective.explanation_text] Успех!" + SSblackbox.record_feedback("nested tally", "morph_objective", 1, list("[objective.type]", "SUCCESS")) else text += "
Цель #[count]: [objective.explanation_text] Провал." + SSblackbox.record_feedback("nested tally", "morph_objective", 1, list("[objective.type]", "FAIL")) traitorwin = FALSE count++ if(traitorwin) text += "
Морф был успешен!" + SSblackbox.record_feedback("tally", "morph_success", 1, "SUCCESS") else text += "
Морф провалился!" + SSblackbox.record_feedback("tally", "morph_success", 1, "FAIL") to_chat(world, text) return TRUE @@ -58,15 +62,19 @@ for(var/datum/objective/objective in all_objectives) if(objective.check_completion()) text += "
Цель #[count]: [objective.explanation_text] Успех!" + SSblackbox.record_feedback("nested tally", "revenant_objective", 1, list("[objective.type]", "SUCCESS")) else text += "
Цель #[count]: [objective.explanation_text] Провал." + SSblackbox.record_feedback("nested tally", "revenant_objective", 1, list("[objective.type]", "FAIL")) traitorwin = FALSE count++ if(traitorwin) text += "
Ревенант был успешен!" + SSblackbox.record_feedback("tally", "revenant_success", 1, "SUCCESS") else text += "
Ревенант провалился!" + SSblackbox.record_feedback("tally", "revenant_success", 1, "FAIL") to_chat(world, text) return TRUE @@ -96,15 +104,19 @@ for(var/datum/objective/objective in all_objectives) if(objective.check_completion()) text += "
Цель #[count]: [objective.explanation_text] Успех!" + SSblackbox.record_feedback("nested tally", "honksquad_objective", 1, list("[objective.type]", "SUCCESS")) else text += "
Цель #[count]: [objective.explanation_text] Провал." + SSblackbox.record_feedback("nested tally", "honksquad_objective", 1, list("[objective.type]", "FAIL")) traitorwin = FALSE count++ if(traitorwin) text += "
Член Хонксквада был успешен!" + SSblackbox.record_feedback("tally", "honksquad_success", 1, "SUCCESS") else text += "
Член Хонксквада провалился!" + SSblackbox.record_feedback("tally", "honksquad_success", 1, "FAIL") to_chat(world, text) return TRUE @@ -134,15 +146,19 @@ for(var/datum/objective/objective in all_objectives) if(objective.check_completion()) text += "
Цель #[count]: [objective.explanation_text] Успех!" + SSblackbox.record_feedback("nested tally", "deathsquad_objective", 1, list("[objective.type]", "SUCCESS")) else text += "
Цель #[count]: [objective.explanation_text] Провал." + SSblackbox.record_feedback("nested tally", "deathsquad_objective", 1, list("[objective.type]", "FAIL")) traitorwin = FALSE count++ if(traitorwin) text += "
Боец Отряда Смерти был успешен!" + SSblackbox.record_feedback("tally", "deathsquad_success", 1, "SUCCESS") else text += "
Боец Отряда Смерти провалился!" + SSblackbox.record_feedback("tally", "deathsquad_success", 1, "FAIL") to_chat(world, text) return TRUE @@ -172,15 +188,19 @@ for(var/datum/objective/objective in all_objectives) if(objective.check_completion()) text += "
Цель #[count]: [objective.explanation_text] Успех!" + SSblackbox.record_feedback("nested tally", "sst_objective", 1, list("[objective.type]", "SUCCESS")) else text += "
Цель #[count]: [objective.explanation_text] Провал." + SSblackbox.record_feedback("nested tally", "sst_objective", 1, list("[objective.type]", "FAIL")) traitorwin = FALSE count++ if(traitorwin) text += "
Боец Ударного Отряда Синдиката успешен!" + SSblackbox.record_feedback("tally", "sst_success", 1, "SUCCESS") else text += "
Боец Ударного Отряда Синдиката провалился!" + SSblackbox.record_feedback("tally", "sst_success", 1, "FAIL") to_chat(world, text) return TRUE @@ -210,14 +230,18 @@ for(var/datum/objective/objective in all_objectives) if(objective.check_completion()) text += "
Цель #[count]: [objective.explanation_text] Успех!" + SSblackbox.record_feedback("nested tally", "sit_objective", 1, list("[objective.type]", "SUCCESS")) else text += "
Цель #[count]: [objective.explanation_text] Провал." + SSblackbox.record_feedback("nested tally", "sit_objective", 1, list("[objective.type]", "FAIL")) traitorwin = FALSE count++ if(traitorwin) text += "
Агент Диверсионного Отряда Синдиката был успешен!" + SSblackbox.record_feedback("tally", "sit_success", 1, "SUCCESS") else text += "
Агент Диверсионного Отряда Синдиката провалился!" + SSblackbox.record_feedback("tally", "sit_success", 1, "FAIL") to_chat(world, text) return TRUE diff --git a/code/game/gamemodes/blob/blob_finish.dm b/code/game/gamemodes/blob/blob_finish.dm index f23de08daaf..83b8f3e819d 100644 --- a/code/game/gamemodes/blob/blob_finish.dm +++ b/code/game/gamemodes/blob/blob_finish.dm @@ -52,8 +52,10 @@ to_chat(world, "Целью блобов было:") if(blob_objective.check_completion() && (!station_was_nuked || blob_stage == BLOB_STAGE_POST_END)) to_chat(world, "
[blob_objective.explanation_text] Успех!") + SSblackbox.record_feedback("nested tally", "traitor_objective", 1, list("[blob_objective.type]", "SUCCESS")) else to_chat(world, "
[blob_objective.explanation_text] Провал.") + SSblackbox.record_feedback("nested tally", "traitor_objective", 1, list("[blob_objective.type]", "FAIL")) return TRUE diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 08b7544dc58..afd5f851ad2 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -90,15 +90,27 @@ for(var/datum/objective/objective in all_objectives) if(objective.check_completion()) text += "
Objective #[count]: [objective.explanation_text] Success!" + if(istype(objective, /datum/objective/steal)) + var/datum/objective/steal/steal_objective = objective + SSblackbox.record_feedback("nested tally", "changeling_steal_objective", 1, list("Steal [steal_objective.steal_target]", "SUCCESS")) + else + SSblackbox.record_feedback("nested tally", "changeling_objective", 1, list("[objective.type]", "SUCCESS")) else text += "
Objective #[count]: [objective.explanation_text] Fail." + if(istype(objective, /datum/objective/steal)) + var/datum/objective/steal/steal_objective = objective + SSblackbox.record_feedback("nested tally", "changeling_steal_objective", 1, list("Steal [steal_objective.steal_target]", "FAIL")) + else + SSblackbox.record_feedback("nested tally", "changeling_objective", 1, list("[objective.type]", "FAIL")) changelingwin = FALSE count++ if(changelingwin) text += "
The changeling was successful!" + SSblackbox.record_feedback("tally", "changeling_success", 1, "SUCCESS") else text += "
The changeling has failed." + SSblackbox.record_feedback("tally", "changeling_success", 1, "FAIL") to_chat(world, text) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 5c0356177cc..f9ef49c1c31 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -197,17 +197,82 @@ /datum/game_mode/proc/declare_completion() + var/clients = 0 + var/surviving_humans = 0 var/surviving_total = 0 var/ghosts = 0 + var/escaped_humans = 0 + var/escaped_total = 0 + var/escaped_on_pod_1 = 0 + var/escaped_on_pod_2 = 0 + var/escaped_on_pod_3 = 0 + var/escaped_on_pod_5 = 0 + var/escaped_on_shuttle = 0 + + var/list/area/escape_locations = list(/area/shuttle/escape, /area/shuttle/escape_pod1/centcom, /area/shuttle/escape_pod2/centcom, /area/shuttle/escape_pod3/centcom, /area/shuttle/escape_pod5/centcom) + + if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME) //shuttle didn't get to centcom + escape_locations -= /area/shuttle/escape for(var/mob/player in GLOB.player_list) if(player.client) + clients++ + + var/area/player_area = get_area(player) + + if(ishuman(player)) + if(!player.stat) + surviving_humans++ + if(player_area?.type in escape_locations) + escaped_humans++ + if(!player.stat) - surviving_total++ //bruh. Beeb - Мы и так не исользуем вебхук, неизвестно почему, но такое вот решение + surviving_total++ + + if(player_area?.type in escape_locations) + escaped_total++ + + if(player_area?.type == SSshuttle.emergency.areaInstance.type && SSshuttle.emergency.mode == SHUTTLE_ENDGAME) + escaped_on_shuttle++ + + if(player_area?.type == /area/shuttle/escape_pod1/centcom) + escaped_on_pod_1++ + + if(player_area?.type == /area/shuttle/escape_pod2/centcom) + escaped_on_pod_2++ + + if(player_area?.type == /area/shuttle/escape_pod3/centcom) + escaped_on_pod_3++ + + if(player_area?.type == /area/shuttle/escape_pod5/centcom) + escaped_on_pod_5++ if(isobserver(player)) ghosts++ + if(clients) + SSblackbox.record_feedback("nested tally", "round_end_stats", clients, list("clients")) + if(ghosts) + SSblackbox.record_feedback("nested tally", "round_end_stats", ghosts, list("ghosts")) + if(surviving_humans) + SSblackbox.record_feedback("nested tally", "round_end_stats", surviving_humans, list("survivors", "human")) + if(surviving_total) + SSblackbox.record_feedback("nested tally", "round_end_stats", surviving_total, list("survivors", "total")) + if(escaped_humans) + SSblackbox.record_feedback("nested tally", "round_end_stats", escaped_humans, list("escapees", "human")) + if(escaped_total) + SSblackbox.record_feedback("nested tally", "round_end_stats", escaped_total, list("escapees", "total")) + if(escaped_on_shuttle) + SSblackbox.record_feedback("nested tally", "round_end_stats", escaped_on_shuttle, list("escapees", "on_shuttle")) + if(escaped_on_pod_1) + SSblackbox.record_feedback("nested tally", "round_end_stats", escaped_on_pod_1, list("escapees", "on_pod_1")) + if(escaped_on_pod_2) + SSblackbox.record_feedback("nested tally", "round_end_stats", escaped_on_pod_2, list("escapees", "on_pod_2")) + if(escaped_on_pod_3) + SSblackbox.record_feedback("nested tally", "round_end_stats", escaped_on_pod_3, list("escapees", "on_pod_3")) + if(escaped_on_pod_5) + SSblackbox.record_feedback("nested tally", "round_end_stats", escaped_on_pod_5, list("escapees", "on_pod_5")) + SSdiscord.send2discord_simple(DISCORD_WEBHOOK_PRIMARY, "A round of [name] has ended - [surviving_total] survivors, [ghosts] ghosts. Round ID - [GLOB.round_id]. Duration - [ROUND_TIME_TEXT()]") return FALSE diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm index 5e45579719e..f920ce70b34 100644 --- a/code/game/gamemodes/heist/heist.dm +++ b/code/game/gamemodes/heist/heist.dm @@ -234,8 +234,10 @@ GLOBAL_LIST_EMPTY(cortical_stacks) //Stacks for 'leave nobody behind' objective. for(var/datum/objective/objective in raid_objectives) if(objective.check_completion()) to_chat(world, "
Objective #[count]: [objective.explanation_text] Success!") + SSblackbox.record_feedback("nested tally", "traitor_objective", 1, list("[objective.type]", "SUCCESS")) else to_chat(world, "
Objective #[count]: [objective.explanation_text] Fail.") + SSblackbox.record_feedback("nested tally", "traitor_objective", 1, list("[objective.type]", "FAIL")) count++ ..() diff --git a/code/game/gamemodes/spaceninja/space_ninja.dm b/code/game/gamemodes/spaceninja/space_ninja.dm index 05886daf3c3..c28323be312 100644 --- a/code/game/gamemodes/spaceninja/space_ninja.dm +++ b/code/game/gamemodes/spaceninja/space_ninja.dm @@ -107,15 +107,19 @@ for(var/datum/objective/objective in ninja.get_all_objectives()) if(objective.check_completion()) text += "
Цель #[count]: [objective.explanation_text] Успех!" + SSblackbox.record_feedback("nested tally", "ninja_objective", 1, list("[objective.type]", "SUCCESS")) else text += "
Цель #[count]: [objective.explanation_text] Провал." + SSblackbox.record_feedback("nested tally", "ninja_objective", 1, list("[objective.type]", "FAIL")) ninjawin = FALSE count++ if(ninja.current && ninja.current.stat != DEAD && ninjawin) text += "
Ниндзя успешно выполнил свои задачи!" + SSblackbox.record_feedback("tally", "ninja_success", 1, "SUCCESS") else text += "
Ниндзя провалился!" + SSblackbox.record_feedback("tally", "ninja_success", 1, "FAIL") text += "
" to_chat(world, text) diff --git a/code/game/gamemodes/thief/thief.dm b/code/game/gamemodes/thief/thief.dm index 32861f2672e..e8ec2f4fe1b 100644 --- a/code/game/gamemodes/thief/thief.dm +++ b/code/game/gamemodes/thief/thief.dm @@ -71,15 +71,19 @@ for(var/datum/objective/objective in all_objectives) if(objective.check_completion()) text += "
Цель #[count]: [objective.explanation_text] Выполнена!" + SSblackbox.record_feedback("nested tally", "thief_objective", 1, list("[objective.type]", "SUCCESS")) else text += "
Цель #[count]: [objective.explanation_text] Провалена." + SSblackbox.record_feedback("nested tally", "thief_objective", 1, list("[objective.type]", "FAIL")) thiefwin = FALSE count++ if(thiefwin) text += "
Вор преуспел!
" + SSblackbox.record_feedback("tally", "thief_success", 1, "SUCCESS") else text += "
Вор провалился.
" + SSblackbox.record_feedback("tally", "thief_success", 1, "FAIL") to_chat(world, text) return TRUE diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 966bd5f9aea..8485cb85b68 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -136,8 +136,18 @@ for(var/datum/objective/objective in all_objectives) if(objective.check_completion()) text += "
Objective #[count]: [objective.explanation_text] Success!" + if(istype(objective, /datum/objective/steal)) + var/datum/objective/steal/steal_objective = objective + SSblackbox.record_feedback("nested tally", "traitor_steal_objective", 1, list("Steal [steal_objective.steal_target]", "SUCCESS")) + else + SSblackbox.record_feedback("nested tally", "traitor_objective", 1, list("[objective.type]", "SUCCESS")) else text += "
Objective #[count]: [objective.explanation_text] Fail." + if(istype(objective, /datum/objective/steal)) + var/datum/objective/steal/steal_objective = objective + SSblackbox.record_feedback("nested tally", "traitor_steal_objective", 1, list("Steal [steal_objective.steal_target]", "FAIL")) + else + SSblackbox.record_feedback("nested tally", "traitor_objective", 1, list("[objective.type]", "FAIL")) traitorwin = FALSE count++ @@ -169,8 +179,10 @@ if(traitorwin) text += "
The [special_role_text] was successful!
" + SSblackbox.record_feedback("tally", "traitor_success", 1, "SUCCESS") else text += "
The [special_role_text] has failed!
" + SSblackbox.record_feedback("tally", "traitor_success", 1, "FAIL") if(length(SSticker.mode.implanted)) text += "

The mindslaves were:
" diff --git a/code/game/gamemodes/vampire/goon_vampire.dm b/code/game/gamemodes/vampire/goon_vampire.dm index 14c31cf57af..ca50b58ccb3 100644 --- a/code/game/gamemodes/vampire/goon_vampire.dm +++ b/code/game/gamemodes/vampire/goon_vampire.dm @@ -83,8 +83,18 @@ for(var/datum/objective/objective in all_objectives) if(objective.check_completion()) text += "
Objective #[count]: [objective.explanation_text] Success!" + if(istype(objective, /datum/objective/steal)) + var/datum/objective/steal/steal = objective + SSblackbox.record_feedback("nested tally", "vampire_steal_objective", 1, list("Steal [steal.steal_target]", "SUCCESS")) + else + SSblackbox.record_feedback("nested tally", "vampire_objective", 1, list("[objective.type]", "SUCCESS")) else text += "
Objective #[count]: [objective.explanation_text] Fail." + if(istype(objective, /datum/objective/steal)) + var/datum/objective/steal/steal = objective + SSblackbox.record_feedback("nested tally", "vampire_steal_objective", 1, list("Steal [steal.steal_target]", "FAIL")) + else + SSblackbox.record_feedback("nested tally", "vampire_objective", 1, list("[objective.type]", "FAIL")) traitorwin = FALSE count++ @@ -96,8 +106,10 @@ if(traitorwin) text += "
The [special_role_text] was successful!" + SSblackbox.record_feedback("tally", "vampire_success", 1, "SUCCESS") else text += "
The [special_role_text] has failed!" + SSblackbox.record_feedback("tally", "vampire_success", 1, "FAIL") to_chat(world, text) return TRUE diff --git a/code/game/gamemodes/vampire/vampire.dm b/code/game/gamemodes/vampire/vampire.dm index 653bca8c751..0434e246cac 100644 --- a/code/game/gamemodes/vampire/vampire.dm +++ b/code/game/gamemodes/vampire/vampire.dm @@ -82,8 +82,18 @@ for(var/datum/objective/objective in all_objectives) if(objective.check_completion()) text += "
Objective #[count]: [objective.explanation_text] Success!" + if(istype(objective, /datum/objective/steal)) + var/datum/objective/steal/S = objective + SSblackbox.record_feedback("nested tally", "vampire_steal_objective", 1, list("Steal [S.steal_target]", "SUCCESS")) + else + SSblackbox.record_feedback("nested tally", "vampire_objective", 1, list("[objective.type]", "SUCCESS")) else text += "
Objective #[count]: [objective.explanation_text] Fail." + if(istype(objective, /datum/objective/steal)) + var/datum/objective/steal/S = objective + SSblackbox.record_feedback("nested tally", "vampire_steal_objective", 1, list("Steal [S.steal_target]", "FAIL")) + else + SSblackbox.record_feedback("nested tally", "vampire_objective", 1, list("[objective.type]", "FAIL")) traitorwin = FALSE count++ @@ -95,8 +105,10 @@ if(traitorwin) text += "
The [special_role_text] was successful!" + SSblackbox.record_feedback("tally", "vampire_success", 1, "SUCCESS") else text += "
The [special_role_text] has failed!" + SSblackbox.record_feedback("tally", "vampire_success", 1, "FAIL") to_chat(world, text) return TRUE diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index f09618175a9..313330a3898 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -49,6 +49,7 @@ aspell.on_purchase_upgrade() return TRUE //No same spell found - just learn it + SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) user.mind.AddSpell(newspell) to_chat(user, "You have learned [newspell.name].") return TRUE @@ -363,6 +364,7 @@ is_ragin_restricted = TRUE /datum/spellbook_entry/summon/guns/Buy(mob/living/carbon/human/user, obj/item/spellbook/book) + SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) rightandwrong(SUMMON_GUNS, user, 10) active = TRUE playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, TRUE) @@ -375,6 +377,7 @@ is_ragin_restricted = TRUE /datum/spellbook_entry/summon/magic/Buy(mob/living/carbon/human/user, obj/item/spellbook/book) + SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) rightandwrong(SUMMON_MAGIC, user, 10) active = TRUE playsound(get_turf(user), 'sound/magic/castsummon.ogg', 50, TRUE) @@ -394,6 +397,7 @@ user.put_in_hands(new item_path) else new item_path(user.loc) + SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) return TRUE /datum/spellbook_entry/item/GetInfo() diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 8511a9e32fe..4e272eb52b8 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -325,15 +325,19 @@ for(var/datum/objective/objective in wizard.objectives) if(objective.check_completion()) text += "
Objective #[count]: [objective.explanation_text] Success!" + SSblackbox.record_feedback("nested tally", "wizard_objective", 1, list("[objective.type]", "SUCCESS")) else text += "
Objective #[count]: [objective.explanation_text] Fail." + SSblackbox.record_feedback("nested tally", "wizard_objective", 1, list("[objective.type]", "FAIL")) wizardwin = 0 count++ if(wizard.current && wizard.current.stat!=DEAD && wizardwin) text += "
The wizard was successful!" + SSblackbox.record_feedback("tally", "wizard_success", 1, "SUCCESS") else text += "
The wizard has failed!" + SSblackbox.record_feedback("tally", "wizard_success", 1, "FAIL") if(LAZYLEN(wizard.spell_list)) text += "
[wizard.name] used the following spells: " var/i = 1 @@ -364,15 +368,19 @@ for(var/datum/objective/objective in apprentice.objectives) if(objective.check_completion()) text += "
Objective #[count]: [objective.explanation_text] Success!" + SSblackbox.record_feedback("nested tally", "wizard_objective", 1, list("[objective.type]", "SUCCESS")) else text += "
Objective #[count]: [objective.explanation_text] Fail." + SSblackbox.record_feedback("nested tally", "wizard_objective", 1, list("[objective.type]", "FAIL")) wizardwin = 0 count++ if(apprentice.current && apprentice.current.stat!=DEAD && wizardwin) text += "
The wizard was successful!" + SSblackbox.record_feedback("tally", "wizard_success", 1, "SUCCESS") else text += "
The wizard has failed!" + SSblackbox.record_feedback("tally", "wizard_success", 1, "FAIL") text += "
" to_chat(world, text) diff --git a/code/game/jobs/job/support_chaplain.dm b/code/game/jobs/job/support_chaplain.dm index 0b7bca68f46..58fc8953f87 100644 --- a/code/game/jobs/job/support_chaplain.dm +++ b/code/game/jobs/job/support_chaplain.dm @@ -13,7 +13,7 @@ minimal_access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_MAINT_TUNNELS) alt_titles = list("Priest","Monk","Preacher","Reverend","Oracle","Nun","Imam","Exorcist") outfit = /datum/outfit/job/chaplain - + //God will not give you a salary roflcat salary = 60 min_start_money = 10 @@ -76,6 +76,7 @@ B.name = pick("Principle of Relativity", "Quantum Enigma: Physics Encounters Consciousness", "Programming the Universe", "Quantum Physics and Theology", "String Theory for Dummies", "How To: Build Your Own Warp Drive", "The Mysteries of Bluespace", "Playing God: Collector's Edition") else B.name = "The Holy Book of [new_religion]" + SSblackbox.record_feedback("text", "religion_name", 1, "[new_religion]", 1) var/deity_name = "Space Jesus" var/new_deity = copytext_char(clean_input("Who or what do you worship? Default is Space Jesus.", "Name change", deity_name, user), 1, MAX_NAME_LEN) @@ -83,6 +84,7 @@ if(!length(new_deity) || (new_deity == "Space Jesus")) new_deity = deity_name B.deity_name = new_deity + SSblackbox.record_feedback("text", "religion_deity", 1, "[new_deity]", 1) user.AddSpell(new /obj/effect/proc_holder/spell/chaplain_bless(null)) diff --git a/code/game/jobs/job_objective.dm b/code/game/jobs/job_objective.dm index 6ab07bf8f6b..ee03497e717 100644 --- a/code/game/jobs/job_objective.dm +++ b/code/game/jobs/job_objective.dm @@ -60,13 +60,19 @@ for(var/datum/job_objective/objective in employee.job_objectives) if(objective.is_completed(1)) text += "
 - Задача №[count]: [objective.get_description()] Выполнена!" + SSblackbox.record_feedback("nested tally", "employee_objective", 1, list("[objective.type]", "SUCCESS")) tasks_completed++ else text += "
 - Задача №[count]: [objective.get_description()] Провалена." + SSblackbox.record_feedback("nested tally", "employee_objective", 1, list("[objective.type]", "FAIL")) count++ if(tasks_completed >= 1) text += "
 [employee.name] сделал свою чёртову работу!" + SSblackbox.record_feedback("tally", "employee_success", 1, "SUCCESS") + + else + SSblackbox.record_feedback("tally", "employee_success", 1, "FAIL") return text diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 89459b67eb4..316a7eb0b9e 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -196,6 +196,7 @@ if(A) //if there's no brain, the mob is deleted and a structure/AIcore is created A.rename_self(JOB_TITLE_AI, 1) SSticker?.score?.save_silicon_laws(A, user, "AI construction", log_all_laws = TRUE) + SSblackbox.record_feedback("amount", "ais_created", 1) qdel(src) if(AI_READY_CORE) to_chat(user, span_notice("You disconnect the monitor.")) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 33006e0d2f2..bef9130bdbb 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -196,6 +196,7 @@ playsound(loc, 'sound/arcade/win.ogg', 50, TRUE) if(emagged) + SSblackbox.record_feedback("tally", "arcade_status", 1, "win_emagged") new /obj/effect/spawner/newbomb/timer/syndicate(get_turf(src)) new /obj/item/clothing/head/collectable/petehat(get_turf(src)) message_admins("[key_name_admin(usr)] has outbombed Cuban Pete and been awarded a bomb.") @@ -203,6 +204,7 @@ Reset() emagged = 0 else + SSblackbox.record_feedback("tally", "arcade_status", 1, "win_normal") var/score = player_hp + player_mp + 5 prizevend(score) @@ -225,7 +227,10 @@ temp = "Вы были опустошены! ИГРА ОКОНЧЕНА" playsound(loc, 'sound/arcade/lose.ogg', 50, TRUE) if(emagged) + SSblackbox.record_feedback("tally", "arcade_status", 1, "loss_mana_emagged") usr.gib() + else + SSblackbox.record_feedback("tally", "arcade_status", 1, "loss_mana_normal") else if((enemy_hp <= 10) && (enemy_mp > 4)) temp = "[enemy_name] восстанавливает 4 единицы здоровья!" @@ -244,7 +249,10 @@ temp = "Вы были сокрушены! ИГРА ОКОНЧЕНА" playsound(loc, 'sound/arcade/lose.ogg', 50, TRUE) if(emagged) + SSblackbox.record_feedback("tally", "arcade_status", 1, "loss_hp_emagged") usr.gib() + else + SSblackbox.record_feedback("tally", "arcade_status", 1, "loss_hp_normal") blocked = 0 return diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index e4fee8a0010..066c5c36c93 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -335,6 +335,7 @@ if("move_gamma_armory") if(!FULL_ADMIN_CHECK(ui.user)) return + SSblackbox.record_feedback("tally", "admin_comms_console", 1, "Send Gamma Armory") log_and_message_admins("moved the gamma armory") if(!SSshuttle.toggleShuttle("gamma_shuttle","gamma_home","gamma_away", TRUE)) GLOB.gamma_ship_location = !GLOB.gamma_ship_location @@ -366,6 +367,8 @@ print_command_report(params["text"], "Секретно: [params["subtitle"]]") log_and_message_admins("has created a communications report: [params["text"]]") + // Okay but this is just an IC way of accessing the same verb + SSblackbox.record_feedback("tally", "admin_comms_console", 1, "Create CC Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /obj/machinery/computer/communications/proc/print_nuke_codes() playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, TRUE) diff --git a/code/game/machinery/tcomms/_base.dm b/code/game/machinery/tcomms/_base.dm index 8dbe0e3f6d8..295644be960 100644 --- a/code/game/machinery/tcomms/_base.dm +++ b/code/game/machinery/tcomms/_base.dm @@ -372,6 +372,10 @@ GLOBAL_LIST_EMPTY(tcomms_machines) // --- Some more pre-message formatting --- var/part_b = " " // Tweaked for security headsets -- TLE + // --- This following recording is intended for research and feedback in the use of department radio channels --- + + SSblackbox.LogBroadcast(display_freq) + /* ###### Send the message ###### */ diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index 9d06b38d8d0..f71553b6061 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -22,6 +22,9 @@ else return ..() +/datum/construction/mecha/spawn_result(name) + SSblackbox.record_feedback("tally", "mechas_created", 1, "[name]") + /datum/construction/reversible/mecha/custom_action(index as num, diff as num, atom/used_atom, mob/user as mob) if(istype(used_atom, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/C = used_atom diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 112d9073421..a72c597620b 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -138,6 +138,7 @@ if(l_arm && r_arm) if(l_leg && r_leg) if(chest && head) + SSblackbox.record_feedback("amount", "cyborg_frames_built", 1) return 1 return 0 @@ -368,6 +369,8 @@ new_borg.mmi = new_mmi new_borg.Namepick() + SSblackbox.record_feedback("amount", "cyborg_birth", 1) + forceMove(new_borg) new_borg.robot_suit = src diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index f3d7bccd1e1..a3f9685154f 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -110,6 +110,7 @@ ) add_attack_logs(user, target, "Handcuffed ([src])") + SSblackbox.record_feedback("tally", "handcuffs", 1, type) if(trashtype && !dispense) qdel(src) diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index d6458d0730b..5904a426d4b 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -99,6 +99,7 @@ if(picked_type in container_paths) var/storage_path = container_paths[picked_type] var/obj/item/storage/storage = new storage_path(get_turf(user)) + SSblackbox.record_feedback("text", "chaplain_weapon", 1, "[picked_type]", 1) var/obj/item/nullrod/new_rod = locate(picked_type) in storage if(new_rod) new_rod.reskinned = TRUE @@ -111,6 +112,8 @@ var/obj/item/nullrod/new_rod = new picked_type(get_turf(user)) + SSblackbox.record_feedback("text", "chaplain_weapon", 1, "[picked_type]", 1) + if(new_rod) new_rod.reskinned = TRUE qdel(src) diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm index 20b297c4c52..3fae99aeb0d 100644 --- a/code/game/objects/items/weapons/legcuffs.dm +++ b/code/game/objects/items/weapons/legcuffs.dm @@ -157,6 +157,9 @@ else moving_human.apply_damage(trap_damage, BRUTE, (pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))) + if(moving_human.apply_restraints(src, ITEM_SLOT_LEGCUFFED)) //beartrap can't cuff you leg if there's already a beartrap or legcuffs. + SSblackbox.record_feedback("tally", "handcuffs", 1, type) + return moving_thing.apply_damage(trap_damage, BRUTE) @@ -308,6 +311,7 @@ if(knockdown_amt) target.Knockdown(knockdown_amt) playsound(loc, hitsound, 50, TRUE) + SSblackbox.record_feedback("tally", "handcuffs", 1, type) if(!reusable) item_flags |= DROPDEL diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm index 047942e14b9..04bc1014719 100644 --- a/code/game/objects/items/weapons/storage/bible.dm +++ b/code/game/objects/items/weapons/storage/bible.dm @@ -212,6 +212,8 @@ item_state = choice_icons["inhand"] customisable = FALSE + SSblackbox.record_feedback("text", "religion_book", 1, "[choice]", 1) + if(SSticker) SSticker.Bible_name = name SSticker.Bible_icon_state = icon_state diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index 5e69f10e08d..e2e4a24ad6a 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -97,6 +97,7 @@ I.play_tool_sound(src) . |= (ATTACK_CHAIN_BLOCKED_ALL) attempt_drill(user) + SSblackbox.record_feedback("tally", "pick_used_mining", 1, I.name) /turf/simulated/mineral/proc/gets_drilled(mob/user, triggered_by_explosion = FALSE, override_bonus = FALSE) @@ -113,6 +114,7 @@ new cached_mineralType(src, cached_mineralAmt) if(is_mining_level(z)) SSticker?.score?.score_ore_mined++ // Only include ore spawned on mining level + SSblackbox.record_feedback("tally", "ore_mined", cached_mineralAmt, cached_mineralType) /turf/simulated/mineral/proc/attempt_drill(mob/user,triggered_by_explosion = FALSE, power = 1) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index da6b7cdc5c3..a4b91cbcec2 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -299,6 +299,7 @@ GLOBAL_VAR_INIT(nologevent, 0) popup.set_window_options("can_close=1;can_minimize=0;can_maximize=0;can_resize=0;titlebar=1;") popup.open() onclose(usr, "adminplayeropts") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Show Player Panel") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /datum/player_info/var/author // admin who authored the information @@ -346,7 +347,7 @@ GLOBAL_VAR_INIT(nologevent, 0) dat += text("[t] (unban)") dat += "" usr << browse(dat, "window=ban;size=400x400") - + /datum/admins/proc/Game() if(!check_rights(R_ADMIN)) @@ -404,6 +405,7 @@ GLOBAL_VAR_INIT(nologevent, 0) return FALSE if(result) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Reboot World") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! var/init_by = "Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key]." switch(result) @@ -447,6 +449,7 @@ GLOBAL_VAR_INIT(nologevent, 0) if(announcement) to_chat(world, "[announcement]") SSticker.force_ending = TRUE + SSblackbox.record_feedback("tally", "admin_verb", 1, "End Round") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! SSticker.mode_result = "admin ended" @@ -466,6 +469,7 @@ GLOBAL_VAR_INIT(nologevent, 0) message = replacetext(message, "\n", "
") // required since we're putting it in a

tag to_chat(world, chat_box_notice("[usr.client.holder.fakekey ? "Administrator" : usr.key] Announces:

[message]

")) log_admin("Announce: [key_name(usr)] : [message]") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Announce") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /datum/admins/proc/toggleooc() set category = "Admin.Toggles" @@ -477,6 +481,7 @@ GLOBAL_VAR_INIT(nologevent, 0) toggle_ooc() log_and_message_admins("toggled OOC.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle OOC") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /datum/admins/proc/togglelooc() set category = "Admin.Toggles" @@ -493,6 +498,7 @@ GLOBAL_VAR_INIT(nologevent, 0) else to_chat(world, "The LOOC channel has been globally disabled!") log_and_message_admins("toggled LOOC.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle LOOC") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /datum/admins/proc/toggledsay() set category = "Admin.Toggles" @@ -509,6 +515,7 @@ GLOBAL_VAR_INIT(nologevent, 0) else to_chat(world, "Deadchat has been globally disabled!") log_and_message_admins("toggled deadchat.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle Deadchat") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc /datum/admins/proc/toggleoocdead() set category = "Admin.Toggles" @@ -524,6 +531,7 @@ GLOBAL_VAR_INIT(nologevent, 0) else to_chat(world, "Dead OOC has been globally disabled!") log_and_message_admins("toggled Dead OOC.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle Dead OOC") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /datum/admins/proc/toggleemoji() set category = "Admin.Toggles" @@ -535,6 +543,7 @@ GLOBAL_VAR_INIT(nologevent, 0) CONFIG_SET(flag/disable_ooc_emoji, !CONFIG_GET(flag/disable_ooc_emoji)) log_and_message_admins("toggled OOC Emoji.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle OOC Emoji") /datum/admins/proc/startnow() set category = "Server" @@ -559,6 +568,7 @@ GLOBAL_VAR_INIT(nologevent, 0) if(SSticker.current_state == GAME_STATE_STARTUP) msg = " (The server is still setting up, but the round will be started as soon as possible.)" message_admins("[usr.key] has started the game.[msg]") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Start Game") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! return 1 else to_chat(usr, "Error: Start Now: Game has already started.", confidential=TRUE) @@ -579,6 +589,7 @@ GLOBAL_VAR_INIT(nologevent, 0) to_chat(world, "New players may now enter the game.") log_and_message_admins("toggled new player game entering.") world.update_status() + SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle Entering") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /datum/admins/proc/toggleAI() set category = "Admin.Toggles" @@ -595,6 +606,7 @@ GLOBAL_VAR_INIT(nologevent, 0) to_chat(world, "The AI job is chooseable now.") log_and_message_admins("toggled AI allowed.") world.update_status() + SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle AI") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /datum/admins/proc/toggleaban() set category = "Admin.Toggles" @@ -611,6 +623,7 @@ GLOBAL_VAR_INIT(nologevent, 0) to_chat(world, "You may no longer respawn :(") log_and_message_admins("toggled respawn to [GLOB.abandon_allowed ? "On" : "Off"].") world.update_status() + SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle Respawn") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /datum/admins/proc/delay() set category = "Server" @@ -635,6 +648,7 @@ GLOBAL_VAR_INIT(nologevent, 0) SSticker.ticker_going = TRUE to_chat(world, "The game will start soon.") log_admin("[key_name(usr)] removed the delay.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Delay") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! ////////////////////////////////////////////////////////////////////////////////////////////////ADMIN HELPER PROCS @@ -804,6 +818,7 @@ GLOBAL_VAR_INIT(nologevent, 0) A.flags |= ADMIN_SPAWNED log_and_message_admins("spawned [chosen] at [COORD(usr)]") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Spawn Atom") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /datum/admins/proc/show_traitor_panel(var/mob/M in GLOB.mob_list) @@ -822,6 +837,7 @@ GLOBAL_VAR_INIT(nologevent, 0) return M.mind.edit_memory() + SSblackbox.record_feedback("tally", "admin_verb", 1, "Show Traitor Panel") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /datum/admins/proc/toggleguests() set category = "Admin.Toggles" @@ -837,6 +853,7 @@ GLOBAL_VAR_INIT(nologevent, 0) else to_chat(world, "Guests may now enter the game.") log_and_message_admins("toggled guests game entering [GLOB.guests_allowed ? "" : "dis"]allowed.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle Guests") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /datum/admins/proc/output_ai_laws() var/ai_number = 0 @@ -944,6 +961,7 @@ GLOBAL_VAR_INIT(nologevent, 0) var/mob/living/simple_animal/possessed_object/tomob = new(toitem) log_and_message_admins("has put [frommob.ckey] in control of [tomob.name].") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Ghost Drag") tomob.ckey = frommob.ckey qdel(frommob) @@ -968,6 +986,7 @@ GLOBAL_VAR_INIT(nologevent, 0) tomob.ghostize(0) log_and_message_admins("has put [frommob.ckey] in control of [tomob.name].") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Ghost Drag") tomob.ckey = frommob.ckey qdel(frommob) @@ -986,6 +1005,7 @@ GLOBAL_VAR_INIT(nologevent, 0) return TRUE log_and_message_admins("has put [frommob.ckey] in control of an empty AI core.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Ghost Drag") var/transfer_key = frommob.key // frommob is qdel'd in frommob.AIize() var/mob/living/silicon/ai/ai_character = frommob.AIize() @@ -1089,3 +1109,4 @@ GLOBAL_VAR_INIT(nologevent, 0) SStitle.set_title_html(new_html) message_admins("[key_name_admin(usr)] has changed the title screen HTML.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Change Title Screen") diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 99479dce8a2..629a8a4a81e 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -325,6 +325,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( add_verb(src, /client/proc/show_verbs) to_chat(src, "Almost all of your adminverbs have been hidden.", confidential=TRUE) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Hide Admin Verbs") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! return /client/proc/show_verbs() @@ -338,6 +339,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( add_admin_verbs() to_chat(src, "All of your adminverbs are now visible.", confidential=TRUE) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Show Admin Verbs") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/admin_ghost() set category = "Admin.Admin" @@ -353,6 +355,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( ghost.can_reenter_corpse = 1 //just in-case. ghost.reenter_corpse() log_admin("[key_name(usr)] re-entered their body") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Aghost") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! if(ishuman(mob)) var/mob/living/carbon/human/H = mob H.regenerate_icons() // workaround for #13269 @@ -369,6 +372,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( body.key = "@[key]" //Haaaaaaaack. But the people have spoken. If it breaks; blame adminbus log_admin("[key_name(usr)] has admin-ghosted") // TODO: SStgui.on_transfer() to move windows from old and new + SSblackbox.record_feedback("tally", "admin_verb", 1, "Aghost") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/invisimin() set name = "Invisimin" @@ -390,6 +394,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( mob.remove_from_all_data_huds() to_chat(mob, "Invisimin on. You are now as invisible as a ghost.", confidential=TRUE) log_admin("[key_name(mob)] has turned Invisimin ON") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Invisimin") /client/proc/player_panel_new() set name = "Player Panel" @@ -399,6 +404,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( return holder.player_panel_new() + SSblackbox.record_feedback("tally", "admin_verb", 1, "Player Panel") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! return /client/proc/check_antagonists() @@ -410,6 +416,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( holder.check_antagonists() log_admin("[key_name(usr)] checked antagonists") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Check Antags") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! return /client/proc/check_security() @@ -421,6 +428,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( holder.check_security() log_admin("[key_name(usr)] checked security") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Check Secs") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/antagonists_menu() set name = "Antagonists Menu" @@ -440,6 +448,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( var/datum/ui_module/admin = get_admin_ui_module(/datum/ui_module/admin/antagonist_menu) admin.ui_interact(usr) log_admin("[key_name(usr)] checked antagonists") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Antagonists Menu") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return /client/proc/ban_panel() @@ -453,6 +462,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( holder.unbanpanel() else holder.DB_ban_panel() + SSblackbox.record_feedback("tally", "admin_verb", 1, "Ban Panel") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! return /client/proc/game_panel() @@ -463,6 +473,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( return holder.Game() + SSblackbox.record_feedback("tally", "admin_verb", 1, "Game Panel") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! return /client/proc/secrets() @@ -473,6 +484,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( return holder.Secrets() + SSblackbox.record_feedback("tally", "admin_verb", 1, "Secrets") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! return /client/proc/getStealthKey() @@ -508,6 +520,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( holder.fakekey = new_key createStealthKey() log_and_message_admins("has turned stealth mode [holder.fakekey ? "ON with fake key: [holder.fakekey]" : "OFF"]") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Stealth Mode") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/big_brother() set category = "Admin.Admin" @@ -530,6 +543,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( holder.big_brother = TRUE createStealthKey() log_admin("[key_name(usr)] has turned BB mode [holder.fakekey ? "ON" : "OFF"]") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Big Brother Mode") /client/proc/drop_bomb() // Some admin dickery that can probably be done better -- TLE set category = "Admin.Fun" @@ -567,6 +581,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( explosion(epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, 1, 1, cause = "Admin Drop Bomb") log_admin("[key_name(usr)] created an admin explosion at [epicenter.loc]") message_admins("[key_name_admin(usr)] created an admin explosion at [epicenter.loc]") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Drop Bomb") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/bless(mob/living/M as mob) set category = "Admin.Fun" @@ -914,6 +929,8 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( T.mind.AddSpell(new S) else T.AddSpell(new S) + + SSblackbox.record_feedback("tally", "admin_verb", 1, "Give Spell") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! log_and_message_admins("gave [key_name_log(T)] the spell [S].") /client/proc/give_disease(mob/T in GLOB.mob_list) @@ -924,6 +941,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( if(!choosen_disease) return var/datum/disease/D = new choosen_disease() D.Contract(T) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Give Disease") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! log_and_message_admins("gave [key_name_log(T)] the disease [D].") /client/proc/make_sound(obj/O in view(maxview())) // -- TLE @@ -940,6 +958,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( for(var/mob/V in hearers(O)) V.show_message(admin_pencode_to_html(message), 2) log_and_message_admins("made [O] at [COORD(O)] make a sound") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Make Sound") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/togglebuildmodeself() set name = "Toggle Build Mode Self" @@ -950,6 +969,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( if(src.mob) togglebuildmode(src.mob) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle Build Mode") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/object_talk(var/msg as text) // -- TLE set name = "oSay" @@ -966,6 +986,8 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( log_admin("[key_name(usr)] used oSay on [mob.control_object]: [msg]") message_admins("[key_name_admin(usr)] used oSay on [mob.control_object]: [msg]") + SSblackbox.record_feedback("tally", "admin_verb", 1, "oSay") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! + /client/proc/force_hijack() set category = "Admin.Toggles" set name = "Toggle Shuttle Force Hijack" @@ -980,6 +1002,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( S.forceHijacked = !S.forceHijacked var/admin_verb = S.forceHijacked ? "enabled" : "disabled" log_and_message_admins("[admin_verb] forced shuttle hijack.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "[admin_verb] forced shuttle hijack") /client/proc/deadmin_self() set name = "De-admin self" @@ -998,6 +1021,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( GLOB.de_mentors += ckey update_active_keybindings() to_chat(src, "You are now a normal player.", confidential=TRUE) + SSblackbox.record_feedback("tally", "admin_verb", 1, "De-admin") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/readmin() set name = "Re-admin self" @@ -1088,6 +1112,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( update_active_keybindings() GLOB.de_admins -= ckey GLOB.de_mentors -= ckey + SSblackbox.record_feedback("tally", "admin_verb", 1, "Re-admin") return else to_chat(src, "You are already an admin.", confidential=TRUE) @@ -1160,6 +1185,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( var/datum/ui_module/law_manager/L = new(S) L.ui_interact(usr) log_and_message_admins("has opened [S]'s law manager.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Manage Silicon Laws") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/change_human_appearance_admin(mob/living/carbon/human/H) if(!check_rights(R_EVENT)) @@ -1181,6 +1207,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( if(holder) log_and_message_admins("is altering the appearance of [H].") H.change_appearance(APPEARANCE_ALL, usr, usr, check_species_whitelist = 0) + SSblackbox.record_feedback("tally", "admin_verb", 1, "CMA - Admin") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /// targeted form of admin_observe: this should only appear in the right-click menu. /client/proc/admin_observe_target(mob/target) @@ -1231,6 +1258,7 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list( if("No") log_and_message_admins("has allowed [H] to change [H.p_their()] appearance, with whitelisting of races.") H.change_appearance(APPEARANCE_ALL, H.loc, check_species_whitelist = 1) + SSblackbox.record_feedback("tally", "admin_verb", 1, "CMA - Self") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/free_slot() set name = "Free Job Slot" diff --git a/code/modules/admin/machine_upgrade.dm b/code/modules/admin/machine_upgrade.dm index d6e550604fb..7274dafd4db 100644 --- a/code/modules/admin/machine_upgrade.dm +++ b/code/modules/admin/machine_upgrade.dm @@ -16,3 +16,5 @@ message_admins("[key_name_admin(usr)] has set the component rating of [M] to [new_rating]") log_admin("[key_name(usr)] has set the component rating of [M] to [new_rating]") + + SSblackbox.record_feedback("tally", "admin_verb", 1, "Machine Upgrade") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index efe56d7a800..73a0fa111e2 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -333,7 +333,7 @@ log_admin_rank_modification(adm_ckey, new_rank, rights) else if(task == "permissions") - if(!D) + if(!D) return var/new_value = input_bitfield(usr, "rights", D.rights) if(!new_value) @@ -341,7 +341,7 @@ var/add_bits = new_value & ~D.rights var/removed_bits = D.rights & ~new_value D.rights = new_value - edit_admin_permissions() + edit_admin_permissions() message_admins("[key_name_admin(usr)] переключил флаги админу [adm_ckey]: [add_bits? " ВКЛ - [rights2text(add_bits, " ")]" : ""][removed_bits? " ВЫКЛ - [rights2text(removed_bits, " ")]":""]") log_admin("[key_name(usr)] переключил флаги админу [adm_ckey]: [add_bits? " ВКЛ - [rights2text(add_bits, " ")]" : ""][removed_bits? " ВЫКЛ - [rights2text(removed_bits, " ")]":""]") log_admin_permission_modification(adm_ckey, new_value ) @@ -1593,7 +1593,7 @@ return usr.client.view_msays() - + else if(href_list["devsays"]) if(!check_rights(R_ADMIN | R_VIEWRUNTIMES)) return @@ -2383,6 +2383,7 @@ H.update_inv_l_hand() log_admin("[key_name(H)] got their cookie, spawned by [key_name(src.owner)]") message_admins("[key_name_admin(H)] got [H.p_their()] cookie, spawned by [key_name_admin(src.owner)]") + SSblackbox.record_feedback("amount", "admin_cookies_spawned", 1) to_chat(H, "Your prayers have been answered!! You received the best cookie!") else if(href_list["BlueSpaceArtillery"]) @@ -3017,18 +3018,21 @@ if("sec_clothes") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Remove 'internal' clothing") for(var/obj/item/clothing/under/O in world) qdel(O) ok = 1 if("sec_all_clothes") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Remove ALL clothing") for(var/obj/item/clothing/O in world) qdel(O) ok = 1 if("sec_classic1") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Remove firesuits, grilles, and pods") for(var/obj/item/clothing/suit/fire/O in world) qdel(O) for(var/obj/structure/grille/O in world) @@ -3036,6 +3040,7 @@ if("monkey") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Monkeyize All Humans") for(var/thing in GLOB.human_list) var/mob/living/carbon/human/H = thing spawn(0) @@ -3044,23 +3049,30 @@ if("corgi") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Corgize All Humans") for(var/thing in GLOB.human_list) var/mob/living/carbon/human/H = thing spawn(0) H.corgize() ok = 1 if("honksquad") - usr.client.honksquad() + if(usr.client.honksquad()) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Send Team - HONKsquad") if("striketeam") - usr.client.strike_team() + if(usr.client.strike_team()) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Send Team - Deathsquad") if("striketeam_syndicate") - usr.client.syndicate_strike_team() + if(usr.client.syndicate_strike_team()) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Send Team - Syndie Strike Team") if("infiltrators_syndicate") - usr.client.syndicate_infiltration_team() + if(usr.client.syndicate_infiltration_team()) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Send Team - Syndicate Infiltration Team") if("gimmickteam") - usr.client.gimmick_team() + if(usr.client.gimmick_team()) + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Send Team - Gimmick Team") if("tripleAI") usr.client.triple_ai() + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Triple AI") if("set_station_name") if(!check_rights(R_ADMIN | R_EVENT)) return @@ -3110,6 +3122,8 @@ if(gravity_announce) GLOB.event_announcement.Announce("[gravity_announce]") + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Gravity") + switch(gravity_state) if("Default Gravity Handling") GLOB.gravity_is_on = null @@ -3127,16 +3141,19 @@ if("power") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Power All APCs") log_and_message_admins("made all areas powered") power_restore() if("unpower") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Depower All APCs") log_and_message_admins("made all areas unpowered") power_failure() if("quickpower") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Power All SMESs") log_and_message_admins("made all SMESs powered") power_restore_quick() @@ -3146,6 +3163,7 @@ return if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Prison Warp") log_and_message_admins("teleported all players to the prison station.") for(var/thing in GLOB.human_list) var/mob/living/carbon/human/H = thing @@ -3186,6 +3204,7 @@ var/objective = sanitize(copytext_char(input("Enter an objective"),1,MAX_MESSAGE_LEN)) if(!objective) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Traitor All ([objective])") for(var/mob/living/carbon/human/H in GLOB.player_list) if(H.stat == 2 || !H.client || !H.mind) continue @@ -3201,6 +3220,7 @@ if("togglebombcap") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Bomb Cap") var/newBombCap = input(usr,"What would you like the new bomb cap to be. (entered as the light damage range (the 3rd number in common (1,2,3) notation)) Must be between 4 and 128)", "New Bomb Cap", GLOB.max_ex_light_range) as num|null if(newBombCap < 4) @@ -3221,6 +3241,7 @@ if("flicklights") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Flicker Lights") while(!usr.stat) //knock yourself out to stop the ghosts for(var/mob/M in GLOB.player_list) @@ -3252,18 +3273,21 @@ if("lightout") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Lights Out") log_and_message_admins("has broke a lot of lights") var/datum/event/electrical_storm/E = new /datum/event/electrical_storm E.lightsoutAmount = 2 if("blackout") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Black Out") log_and_message_admins("broke all lights") for(var/obj/machinery/light/L in GLOB.machines) L.break_light_tube() if("whiteout") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Fix All Lights") log_and_message_admins("fixed all lights") for(var/obj/machinery/light/L in GLOB.machines) L.fix() @@ -3271,16 +3295,19 @@ if("floorlava") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Lava Floor") SSweather.run_weather(/datum/weather/floor_is_lava) message_admins("[key_name_admin(usr)] made the floor lava") if("fakelava") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Lava Floor Fake") SSweather.run_weather(/datum/weather/floor_is_lava/fake) message_admins("[key_name_admin(usr)] made aesthetic lava on the floor") if("weatherashstorm") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Weather Ash Storm") SSweather.run_weather(/datum/weather/ash_storm) message_admins("[key_name_admin(usr)] spawned an ash storm on the mining level") if("polymorph") @@ -3288,6 +3315,7 @@ if("stupify") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Mass Braindamage") for(var/mob/living/carbon/human/H in GLOB.player_list) to_chat(H, "You suddenly feel stupid.", confidential=TRUE) H.setBrainLoss(60) @@ -3295,6 +3323,7 @@ if("fakeguns") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Fake Guns") for(var/obj/item/W in world) if(isclothing(W) || istype(W, /obj/item/card/id) || istype(W, /obj/item/disk) || istype(W, /obj/item/tank)) continue @@ -3309,6 +3338,7 @@ if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Chinese Cartoons") log_and_message_admins("made everything kawaii.") for(var/mob/living/carbon/human/human in GLOB.mob_list) SEND_SOUND(human, 'sound/AI/animes.ogg') @@ -3332,6 +3362,7 @@ if("eagles")// if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Egalitarian Station") for(var/obj/machinery/door/airlock/W in GLOB.airlocks) if(is_station_level(W.z) && !istype(get_area(W), /area/bridge) && !istype(get_area(W), /area/crew_quarters) && !istype(get_area(W), /area/security/prison)) W.req_access = list() @@ -3340,22 +3371,27 @@ if("onlyone") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Only One") usr.client.only_one() log_and_message_admins("has triggered HIGHLANDER") if("onlyme") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Only Me") usr.client.only_me() if("onlyoneteam") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Only One Team") usr.client.only_one_team() // message_admins("[key_name_admin(usr)] has triggered ") if("rolldice") + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Roll The Dice") usr.client.roll_dices() if("guns") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Summon Guns") var/survivor_probability = 0 switch(alert("Do you want this to create survivors antagonists?", , "No Antags", "Some Antags", "All Antags!")) if("Some Antags") @@ -3367,6 +3403,7 @@ if("magic") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Summon Magic") var/survivor_probability = 0 switch(alert("Do you want this to create survivors antagonists?", , "No Antags", "Some Antags", "All Antags!")) if("Some Antags") @@ -3502,6 +3539,7 @@ if("moveminingshuttle") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Send Mining Shuttle") if(!SSshuttle.toggleShuttle("mining","mining_home","mining_away")) message_admins("[key_name_admin(usr)] moved mining shuttle") log_admin("[key_name(usr)] moved the mining shuttle") @@ -3509,6 +3547,7 @@ if("movelaborshuttle") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Send Labor Shuttle") if(!SSshuttle.toggleShuttle("laborcamp","laborcamp_home","laborcamp_away")) message_admins("[key_name_admin(usr)] moved labor shuttle") log_admin("[key_name(usr)] moved the labor shuttle") @@ -3516,6 +3555,7 @@ if("moveferry") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Send CentComm Ferry") if(!SSshuttle.toggleShuttle("ferry","ferry_home","ferry_away")) message_admins("[key_name_admin(usr)] moved the centcom ferry") log_admin("[key_name(usr)] moved the centcom ferry") @@ -3523,6 +3563,7 @@ if("gammashuttle") if(!you_realy_want_do_this()) return + SSblackbox.record_feedback("tally", "admin_secrets_fun_used", 1, "Send Gamma Armory") if(!SSshuttle.toggleShuttle("gamma_shuttle","gamma_home","gamma_away", TRUE)) message_admins("[key_name_admin(usr)] moved the gamma armory") log_admin("[key_name(usr)] moved the gamma armory") diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index ab31862837c..bb7734437de 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -36,6 +36,7 @@ GLOBAL_LIST_INIT(adminhelp_ignored_words, list("unknown", "the", "a", "an", "of" //show it to the person adminhelping too to_chat(src, span_boldnotice("[selected_type]: [msg]"), MESSAGE_TYPE_ADMINPM, confidential = TRUE) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Adminhelp") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! switch(selected_type) if("Adminhelp") diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index 1845cf27863..5bf7eabd438 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -62,6 +62,7 @@ log_admin("[key_name(usr)] jumped to [A]") if(!isobserver(usr)) message_admins("[key_name_admin(usr)] jumped to [A]") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Jump To Area") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/jumptoturf(turf/T in world) set name = "\[Admin\] Jump to Turf" @@ -77,8 +78,9 @@ if(!isobserver(usr)) message_admins("[key_name_admin(usr)] jumped to [COORD(T)] in [T.loc]") - + admin_forcemove(usr, T) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Jump To Turf") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! return /client/proc/jumptomob(mob/M) @@ -96,6 +98,7 @@ var/mob/A = src.mob var/turf/T = get_turf(M) if(T && isturf(T)) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Jump To Mob") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! admin_forcemove(A, M.loc) else to_chat(A, "This mob is not located in the game world.") @@ -117,6 +120,8 @@ var/mob/dead/observer/O = usr O.ManualFollow(T) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Jump To Coordinate") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! + if(!isobserver(usr)) message_admins("[key_name_admin(usr)] jumped to coordinates [COORD(T)]") @@ -132,6 +137,8 @@ O.force_eject_occupant(usr) admin_forcemove(usr, M.loc) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Jump To Key") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! + /client/proc/Getmob(mob/M in GLOB.mob_list) set name = "\[Admin\] Get Mob" set desc = "Mob to teleport" @@ -145,6 +152,7 @@ var/obj/O = M.loc O.force_eject_occupant(M) admin_forcemove(M, get_turf(usr)) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Get Mob") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/Getkey() set name = "Get Key" @@ -170,6 +178,7 @@ O.force_eject_occupant(M) admin_forcemove(M, get_turf(usr)) admin_forcemove(usr, M.loc) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Get Key") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/sendmob(mob/M in GLOB.mob_list) set category = "Admin.Admin" @@ -186,6 +195,7 @@ var/obj/O = M.loc O.force_eject_occupant(M) admin_forcemove(M, pick(get_area_turfs(A))) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Send Mob") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! log_and_message_admins("teleported [key_name_admin(M)] to [A]") /proc/admin_forcemove(mob/mover, atom/newloc) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index 9db1dc1a52f..577be0d10de 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -6,6 +6,7 @@ if(!ismob(M) || !M.client) return cmd_admin_pm(M.client,null) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Admin PM Mob") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! //shows a list of clients we could send PMs to, then forwards our choice to cmd_admin_pm @@ -30,6 +31,7 @@ if(!target) return cmd_admin_pm(targets[target],null) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Admin PM Name") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! //shows a list of clients we could send PMs to, then forwards our choice to cmd_admin_pm /client/proc/cmd_admin_pm_by_key_panel() @@ -53,6 +55,7 @@ if(!target) return cmd_admin_pm(targets[target],null) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Admin PM Key") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! //takes input from cmd_admin_pm_context, cmd_admin_pm_panel or /client/Topic and sends them a PM. diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index f6c0580045b..ba03b1d57ac 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -26,6 +26,8 @@ msg = "[msg]" to_chat(C, "ADMIN: [key_name(usr, 1)] ([admin_jump_link(mob)]): [msg]", MESSAGE_TYPE_ADMINCHAT, confidential = TRUE) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Asay") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! + /client/proc/get_admin_say() if(check_rights(R_ADMIN|R_MOD, FALSE)) var/msg = input(src, null, "asay \"text\"") as text|null @@ -61,6 +63,8 @@ msg = "[msg]" to_chat(C, "MENTOR: [display_name] ([admin_jump_link(mob)]): [msg]", MESSAGE_TYPE_MENTORCHAT, confidential = TRUE) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Msay") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! + /client/proc/get_mentor_say() if(check_rights(R_MENTOR | R_ADMIN | R_MOD)) var/msg = input(src, null, "msay \"text\"") as text|null @@ -97,6 +101,7 @@ to_chat(C, "Mentor chat has been disabled.") log_and_message_admins("toggled mentor chat [enabling ? "on" : "off"].") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle Msay") /client/proc/get_dev_team_say() if(check_rights(R_VIEWRUNTIMES | R_ADMIN)) @@ -130,3 +135,5 @@ display_name = holder.fakekey msg = "[msg]" to_chat(C, "DEV: [display_name] ([admin_jump_link(mob)]): [msg]", MESSAGE_TYPE_DEVCHAT, confidential = TRUE) + + SSblackbox.record_feedback("tally", "admin_verb", 1, "Devsay") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/atmosdebug.dm b/code/modules/admin/verbs/atmosdebug.dm index de9212c7cff..26bc74140e3 100644 --- a/code/modules/admin/verbs/atmosdebug.dm +++ b/code/modules/admin/verbs/atmosdebug.dm @@ -4,6 +4,7 @@ if(!src.holder) to_chat(src, "Only administrators may use this command.") return + SSblackbox.record_feedback("tally", "admin_verb", 1, "Check Piping") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! if(alert("WARNING: This command should not be run on a live server. Do you want to continue?", "Check Piping", "No", "Yes") == "No") return @@ -49,6 +50,7 @@ if(!src.holder) to_chat(src, "Only administrators may use this command.") return + SSblackbox.record_feedback("tally", "admin_verb", 1, "Check Power") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! for(var/datum/powernet/PN in SSmachines.powernets) if(!PN.nodes || !PN.nodes.len) diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index eedd0dd82d8..5d7dc521f26 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -43,6 +43,8 @@ prefix = "Administrator" say_dead_direct("[prefix] says, \"[msg]\"") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Dsay") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! + /client/proc/get_dead_say() if(!check_rights(R_ADMIN|R_MOD)) return diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index dbb42bb8113..be7a9801506 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -14,6 +14,8 @@ message_admins("[key_name_admin(src)] toggled debugging on.") log_admin("[key_name(src)] toggled debugging on.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Debug Game") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! + /* 21st Sept 2010 Updated by Skie -- Still not perfect but better! @@ -101,6 +103,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that returnval = WrapAdminProcCall(GLOBAL_PROC, procname, lst) // Pass the lst as an argument list to the proc to_chat(usr, "[procname] returned: [!isnull(returnval) ? returnval : "null"]") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Advanced Proc-Call") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! // All these vars are related to proc call protection // If you add more of these, for the love of fuck, protect them @@ -206,6 +209,8 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) var/returnval = WrapAdminProcCall(A, procname, lst) // Pass the lst as an argument list to the proc to_chat(src, "[procname] returned: [!isnull(returnval) ? returnval : "null"]") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Atom Proc-Call") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! + /client/proc/get_callproc_args() var/argnum = tgui_input_number(src, "Введите число аргументов","Число аргументов:", 0) if(argnum <= 0) @@ -266,6 +271,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) t+= "CO2: [env.carbon_dioxide]\n" usr.show_message(t, 1) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Air Status (Location)") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/cmd_admin_robotize(mob/M in GLOB.mob_list) set category = "Admin.Event" @@ -378,6 +384,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) continue qdel(S) log_and_message_admins("has deleted all Singularities and Tesla orbs.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Del Singulo/Tesla") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/cmd_debug_make_powernets() set category = "Debug" @@ -388,6 +395,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) SSmachines.makepowernets() log_and_message_admins("has remade the powernets. makepowernets() called.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Make Powernets") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/cmd_admin_grantfullaccess(var/mob/M in GLOB.mob_list) set category = "Admin.Debug" @@ -418,6 +426,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) H.update_inv_wear_id() else alert("Invalid mob") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Grant Full Access") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! log_and_message_admins("has granted [M.key] full access.") /client/proc/cmd_assume_direct_control(var/mob/M in GLOB.mob_list) @@ -439,6 +448,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) M.ckey = src.ckey if( isobserver(adminmob) ) qdel(adminmob) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Assume Direct Control") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/cmd_admin_areatest() @@ -588,6 +598,8 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) H.equipOutfit(dresscode) else // We have regenerate_icons() proc in the end of equipOutfit(), so don't need to call it two times. H.regenerate_icons() + + SSblackbox.record_feedback("tally", "admin_verb", 1, "Select Equipment") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! log_and_message_admins("changed the equipment of [key_name_admin(M)] to [dresscode].") /client/proc/robust_dress_shop() @@ -851,6 +863,8 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) if(!isobserver(usr)) message_admins("[key_name_admin(usr)] jumped to ruin [ruinname]") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Jump To Ruin") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! + /client/proc/toggle_medal_disable() set category = "Debug" set name = "Toggle Medal Disable" @@ -862,6 +876,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) SSmedals.hub_enabled = !SSmedals.hub_enabled message_admins("[key_name_admin(src)] [SSmedals.hub_enabled ? "disabled" : "enabled"] the medal hub lockout.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle Medal Disable") // If... log_admin("[key_name(src)] [SSmedals.hub_enabled ? "disabled" : "enabled"] the medal hub lockout.") @@ -996,6 +1011,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) if(answer != "YES") return log_and_message_admins("cleared dynamic transit space.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "CDT") // If... SSmapping.wipe_reservations() //this goes after it's logged, incase something horrible happens. /client/proc/cmd_reload_polls() @@ -1015,3 +1031,4 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) load_poll_data() log_and_message_admins("reloaded polls.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Reload Polls") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index 5bc6aef80a1..e5a9cd8be06 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -20,6 +20,8 @@ message_admins("[key_name_admin(usr)] has checked the air status of [target]") log_admin("[key_name(usr)] has checked the air status of [target]") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Display Air Status") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! + /client/proc/fix_next_move() set category = "Debug" set name = "Unfreeze Everyone" @@ -56,6 +58,8 @@ message_admins("[key_name_admin(largest_move_mob)] had the largest move delay with [largest_move_time] frames / [largest_move_time/10] seconds!") message_admins("[key_name_admin(largest_click_mob)] had the largest click delay with [largest_click_time] frames / [largest_click_time/10] seconds!") message_admins("world.time = [world.time]") + + SSblackbox.record_feedback("tally", "admin_verb", 1, "Unfreeze Everyone") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! return /client/proc/radio_report() @@ -100,6 +104,8 @@ message_admins("[key_name_admin(usr)] has generated a radio report") log_admin("[key_name(usr)] has generated a radio report") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Radio Report") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! + /client/proc/reload_admins() set name = "Reload Admins" set category = "Admin.Admin" @@ -111,6 +117,7 @@ log_admin("[key_name(usr)] has manually reloaded admins") load_admins(run_async=TRUE) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Reload Admins") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/print_jobban_old() diff --git a/code/modules/admin/verbs/gimmick_team.dm b/code/modules/admin/verbs/gimmick_team.dm index 68b3981db46..7263e63f372 100644 --- a/code/modules/admin/verbs/gimmick_team.dm +++ b/code/modules/admin/verbs/gimmick_team.dm @@ -97,5 +97,6 @@ log_and_message_admins("used Spawn Gimmick Team.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Spawn Gimmick Team") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! // --------------------------------------------------------------------------------------------------------- diff --git a/code/modules/admin/verbs/infiltratorteam_syndicate.dm b/code/modules/admin/verbs/infiltratorteam_syndicate.dm index 22070e79b11..1e4e2df9bc2 100644 --- a/code/modules/admin/verbs/infiltratorteam_syndicate.dm +++ b/code/modules/admin/verbs/infiltratorteam_syndicate.dm @@ -88,6 +88,7 @@ GLOBAL_VAR_INIT(sent_syndicate_infiltration_team, 0) if(!teamsize) break log_and_message_admins("has spawned a Syndicate Infiltration Team.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Spawn SIT") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! // --------------------------------------------------------------------------------------------------------- diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 010e0ef809b..53a988a4b4f 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -62,6 +62,7 @@ GLOBAL_VAR_INIT(intercom_range_display_status, 0) if(GLOB.camera_range_display_status) for(var/obj/machinery/camera/C in GLOB.cameranet.cameras) new/obj/effect/debugging/camera_range(C.loc) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Camera Range Display") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/sec_camera_report() set category = "Debug.Mapping" @@ -100,6 +101,7 @@ GLOBAL_VAR_INIT(intercom_range_display_status, 0) output += "" usr << browse(output,"window=airreport;size=1000x500") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Camera Report") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/intercom_view() set category = "Debug.Mapping" @@ -122,6 +124,7 @@ GLOBAL_VAR_INIT(intercom_range_display_status, 0) var/obj/effect/debugging/marker/F = new/obj/effect/debugging/marker(T) if(!(F in view(7,I.loc))) qdel(F) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Intercom Range Display") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/count_objects_on_z_level() set category = "Debug.Mapping" @@ -159,6 +162,7 @@ GLOBAL_VAR_INIT(intercom_range_display_status, 0) atom_list += A to_chat(world, "There are [count] objects of type [type_path] on z-level [num_level].") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Count Objects (On Level)") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/count_objects_all() set category = "Debug.Mapping" @@ -179,3 +183,4 @@ GLOBAL_VAR_INIT(intercom_range_display_status, 0) count++ to_chat(world, "There are [count] objects of type [type_path] in the game world.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Count Objects (Global)") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/massmodvar.dm b/code/modules/admin/verbs/massmodvar.dm index a291ed67e5a..73cbc66e085 100644 --- a/code/modules/admin/verbs/massmodvar.dm +++ b/code/modules/admin/verbs/massmodvar.dm @@ -20,6 +20,7 @@ return src.massmodify_variables(A, var_name, method) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Mass Edit Variables") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/massmodify_variables(datum/O, var_name = "", method = 0) if(!check_rights(R_VAREDIT)) diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index c51c70ad9d9..8dc4e1772a5 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -35,6 +35,8 @@ GLOBAL_LIST_EMPTY(sounds_cache) uploaded_sound.volume = 100 * M.client.prefs.get_channel_volume(CHANNEL_ADMIN) SEND_SOUND(M, uploaded_sound) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Play Global Sound") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! + /client/proc/play_local_sound(S as sound) set category = "Admin.Sounds" @@ -43,6 +45,7 @@ GLOBAL_LIST_EMPTY(sounds_cache) log_and_message_admins("played a local sound [S]") playsound(get_turf(src.mob), S, 50, 0, 0) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Play Local Sound") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/play_web_sound() @@ -110,6 +113,8 @@ GLOBAL_LIST_EMPTY(sounds_cache) to_chat(world, span_boldannounceooc("Сейчас играет: [webpage_url]")) if("Cancel") return + + SSblackbox.record_feedback("nested tally", "played_url", 1, list("[ckey]", "[web_sound_input]")) log_admin("[key_name(src)] played web sound: [web_sound_input]") message_admins("[key_name(src)] played web sound: [web_sound_input]") else @@ -147,6 +152,8 @@ GLOBAL_LIST_EMPTY(sounds_cache) if(C.prefs.sound & SOUND_MIDI) C.tgui_panel?.play_music(url, music_extra_data) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Play Internet Sound") + /client/proc/play_server_sound() set category = "Admin.Sounds" set name = "Play Server Sound" @@ -159,6 +166,7 @@ GLOBAL_LIST_EMPTY(sounds_cache) if(!melody) return play_sound(melody) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Play Server Sound") //If you are copy-pasting this, ensure the 2nd paramter is unique to the new proc! /client/proc/play_intercomm_sound() set category = "Admin.Sounds" diff --git a/code/modules/admin/verbs/possess.dm b/code/modules/admin/verbs/possess.dm index e232c8cbfd4..442c24ffd95 100644 --- a/code/modules/admin/verbs/possess.dm +++ b/code/modules/admin/verbs/possess.dm @@ -26,6 +26,7 @@ usr.client.eye = O usr.control_object = O SEND_SIGNAL(O, COMSIG_OBJ_POSSESSED, usr) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Possess Object") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /proc/release(obj/O as obj in world) set name = "\[Admin\] Release Obj" @@ -46,3 +47,4 @@ usr.client.eye = usr usr.control_object = null SEND_SIGNAL(O, COMSIG_OBJ_RELEASED, usr) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Release Object") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 82a58056703..7b39fa04132 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -40,6 +40,8 @@ SEND_SOUND(X, 'sound/items/PDA/ambicha4-short.ogg') to_chat(usr, "Your prayers have been received by the gods.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Pray") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! + /proc/Centcomm_announce(var/text , var/mob/Sender) var/msg = sanitize(copytext_char(text, 1, MAX_MESSAGE_LEN)) GLOB.requests.message_centcom(Sender.client, msg) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 85287e52b33..45a92496da0 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -12,6 +12,7 @@ M.drop_item_ground(W) log_and_message_admins("made [key_name_admin(M)] drop everything!") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Drop Everything") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/cmd_admin_prison(mob/M as mob in GLOB.mob_list) set category = "Admin.Fun" @@ -40,6 +41,7 @@ spawn(50) to_chat(M, "You have been sent to the prison station!") log_and_message_admins("sent [key_name_admin(M)] to the prison station.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Prison") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/cmd_admin_subtle_message(mob/M as mob in GLOB.mob_list) set name = "\[Admin\] Subtle Message" @@ -63,6 +65,7 @@ to_chat(M, "You hear a voice in your head... [msg]") log_and_message_admins("sent subtle message to [key_name_admin(M)] : [msg]") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Subtle Message") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/cmd_mentor_check_new_players() //Allows mentors / admins to determine who the newer players are. set category = "Admin.Admin" @@ -113,6 +116,7 @@ msg = admin_pencode_to_html(msg) to_chat(world, msg) log_and_message_admins("Sent Global Narrate: [msg]
") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Global Narrate") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/cmd_admin_local_narrate(var/atom/A) set category = "Admin.Event" @@ -129,6 +133,7 @@ for(var/mob/living/M in view(7,A)) to_chat(M, msg) log_and_message_admins("local narrated at [AREACOORD(A)]: [msg]
") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Local Narrate") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/cmd_admin_direct_narrate(var/mob/M) // Targetted narrate -- TLE if(!check_rights(R_SERVER|R_EVENT)) @@ -146,6 +151,7 @@ msg = admin_pencode_to_html(msg) to_chat(M, msg) log_and_message_admins("directly narrated to [key_name_admin(M)]: [msg]
") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Direct Narrate") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! @@ -201,6 +207,7 @@ to_chat(usr, span_notice("Toggled [had_trait ? "OFF" : "ON"]"), confidential=TRUE) log_and_message_admins("has toggled [key_name_admin(mob)]'s nodamage to [had_trait ? "Off" : "On"]") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Godmode") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0) @@ -247,6 +254,7 @@ log_admin("SPAM AUTOMUTE: [muteunmute] [key_name(M)] from [mute_string]") message_admins("SPAM AUTOMUTE: [muteunmute] [key_name_admin(M)] from [mute_string].") to_chat(M, "You have been [muteunmute] from [mute_string] by the SPAM AUTOMUTE system. Contact an admin.", confidential=TRUE) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Automute") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! return toggle_mute(M.client.ckey, mute_type) @@ -258,6 +266,7 @@ log_and_message_admins("has [muteunmute] [key_name_admin(M)] from [mute_string].") to_chat(M, "You have been [muteunmute] from [mute_string].", confidential=TRUE) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Mute") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/cmd_admin_add_random_ai_law() set category = "Admin.Fun" @@ -276,6 +285,7 @@ var/datum/event_meta/meta_info = new(EVENT_LEVEL_MAJOR, "Admin ([key_name(src)]) added random law.", /datum/event/ion_storm) new /datum/event/ion_storm(EM = meta_info, botEmagChance = 0, announceEvent = announce_ion_laws) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Add Random AI Law") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/toggle_antagHUD_use() set category = "Admin.Toggles" @@ -497,6 +507,8 @@ Traitors and the like can also be revived with the previous role mostly intact. log_and_message_admins("has respawned [key_name_admin(G_found)] as [new_character.real_name].") to_chat(new_character, "You have been fully respawned. Enjoy the game.") + + SSblackbox.record_feedback("tally", "admin_verb", 1, "Respawn Character") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! return new_character //I use this proc for respawn character too. /N @@ -576,6 +588,8 @@ Traitors and the like can also be revived with the previous role mostly intact. var/datum/event_meta/meta_info = new(EVENT_LEVEL_MAJOR, "Admin ([key_name(src)]) added freeform law.", /datum/event/ion_storm) new /datum/event/ion_storm(EM = meta_info, botEmagChance = 0, announceEvent = announce_ion_laws, ionMessage = input) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Add Custom AI Law") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! + /client/proc/cmd_admin_rejuvenate(mob/living/M as mob in GLOB.mob_list) set name = "\[Admin\] Rejuvenate" @@ -590,6 +604,7 @@ Traitors and the like can also be revived with the previous role mostly intact. M.revive() log_and_message_admins("healed / revived [key_name_admin(M)]!") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Rejuvenate") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/cmd_admin_offer_control(mob/M as mob in GLOB.mob_list) set name = "\[Admin\] Offer control to ghosts" @@ -650,6 +665,7 @@ Traitors and the like can also be revived with the previous role mostly intact. log_admin("[key_name(src)] has created a communications report: [input]") message_admins("[key_name_admin(src)] has created a communications report") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Create Comms Report") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/cmd_admin_delete(atom/A as obj|mob|turf in view(maxview())) @@ -667,6 +683,7 @@ Traitors and the like can also be revived with the previous role mostly intact. var/atom/A = D if(alert(src, "Are you sure you want to delete:\n[D]\nat [COORD(A)]?", "Confirmation", "Yes", "No") == "Yes") log_and_message_admins("deleted [D] at [COORD(A)]") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Delete") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! if(isturf(D)) var/turf/T = D T.ChangeTurf(T.baseturf) @@ -692,6 +709,7 @@ Traitors and the like can also be revived with the previous role mostly intact. currentpositiontally += job.current_positions totalpositiontally += job.total_positions to_chat(src, "Currently filled job slots (Excluding unlimited): [currentpositiontally] / [totalpositiontally] ([totalpositiontally - currentpositiontally])", confidential=TRUE) + SSblackbox.record_feedback("tally", "admin_verb", 1, "List Free Slots") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in view(maxview())) set category = "Admin.Fun" @@ -718,6 +736,7 @@ Traitors and the like can also be revived with the previous role mostly intact. explosion(O, devastation, heavy, light, flash, null, null,flames) log_and_message_admins("created an explosion ([devastation],[heavy],[light],[flames]) at [COORD(O)]") + SSblackbox.record_feedback("tally", "admin_verb", 1, "EXPL") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! return else return @@ -738,6 +757,7 @@ Traitors and the like can also be revived with the previous role mostly intact. empulse(O, heavy, light) log_and_message_admins("created an EM pulse ([heavy], [light]) at [COORD(O)]") + SSblackbox.record_feedback("tally", "admin_verb", 1, "EMP") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! return else @@ -762,6 +782,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return M.gib() + SSblackbox.record_feedback("tally", "admin_verb", 1, "Gib") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/cmd_admin_gib_self() set name = "Gibself" @@ -778,6 +799,7 @@ Traitors and the like can also be revived with the previous role mostly intact. mob.gib() log_and_message_admins("used gibself.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Gibself") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/cmd_admin_check_contents(mob/living/M as mob in GLOB.mob_list) set name = "\[Admin\] Check Contents" @@ -788,6 +810,7 @@ Traitors and the like can also be revived with the previous role mostly intact. var/list/L = M.get_contents() for(var/atom/t in L) to_chat(usr, "[t] [ADMIN_VV(t,"VV")] ", confidential=TRUE) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Check Contents") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/toggle_view_range() @@ -830,6 +853,7 @@ Traitors and the like can also be revived with the previous role mostly intact. fit_viewport() log_admin("[key_name(usr)] changed their view range to [view].") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Change View Range") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/admin_call_shuttle() @@ -855,6 +879,8 @@ Traitors and the like can also be revived with the previous role mostly intact. SSshuttle.emergency.request(coefficient = 0.5, redAlert = TRUE) else SSshuttle.emergency.request() + + SSblackbox.record_feedback("tally", "admin_verb", 1, "Call Shuttle") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! log_admin("[key_name(usr)] admin-called the emergency shuttle.") message_admins("[key_name_admin(usr)] admin-called the emergency shuttle.") return @@ -881,6 +907,8 @@ Traitors and the like can also be revived with the previous role mostly intact. SSshuttle.emergency.canRecall = FALSE // restores original status else SSshuttle.emergency.cancel() + + SSblackbox.record_feedback("tally", "admin_verb", 1, "Cancel Shuttle") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! log_admin("[key_name(usr)] admin-recalled the emergency shuttle.") message_admins("[key_name_admin(usr)] admin-recalled the emergency shuttle.") return @@ -908,6 +936,8 @@ Traitors and the like can also be revived with the previous role mostly intact. SSticker.toggle_pacifism = (SSticker.toggle_pacifism) ? FALSE : TRUE log_and_message_admins("toggled pacifism after greentext in [(SSticker.toggle_pacifism) ? "On" : "Off"].") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle Pacifism") + /client/proc/toogle_ghost_vision() set name = "Toggle Ghost Vision After Greentext" set category = "Admin.Toggles" @@ -962,6 +992,7 @@ Traitors and the like can also be revived with the previous role mostly intact. to_chat(usr, "Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet.", confidential=TRUE) SSticker.random_players = 1 + SSblackbox.record_feedback("tally", "admin_verb", 1, "Make Everyone Random") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/toggle_random_events() set category = "Admin.Toggles" @@ -979,6 +1010,7 @@ Traitors and the like can also be revived with the previous role mostly intact. CONFIG_SET(flag/allow_random_events, FALSE) to_chat(usr, "Random events disabled", confidential=TRUE) log_and_message_admins("has disabled random events.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle Random Events") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/reset_all_tcs() set category = "Admin.Debug" @@ -997,6 +1029,7 @@ Traitors and the like can also be revived with the previous role mostly intact. log_admin("[key_name(usr)] reset NTTC scripts.") message_admins("[key_name_admin(usr)] reset NTTC scripts.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Reset NTTC Configuration") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/list_ssds_afks() set category = "Admin.Admin" @@ -1228,7 +1261,7 @@ Traitors and the like can also be revived with the previous role mostly intact. var/keep_name = tgui_alert(src, "Вы хотите, чтобы существа сохранили свои имена?", "Сохранить имена?", list("Да", "Нет")) var/list/mobs = shuffle(GLOB.alive_player_list.Copy()) // might change while iterating - + log_and_message_admins("polymorphed ALL living mobs.") for(var/mob/living/M in mobs) diff --git a/code/modules/admin/verbs/requests.dm b/code/modules/admin/verbs/requests.dm index ed95f750aa1..3dac4125e60 100644 --- a/code/modules/admin/verbs/requests.dm +++ b/code/modules/admin/verbs/requests.dm @@ -4,3 +4,4 @@ set desc = "Open the request manager panel to view all requests during this round" set category = "Admin.Admin Paperworks" GLOB.requests.ui_interact(usr) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Request Manager") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/space_transitions.dm b/code/modules/admin/verbs/space_transitions.dm index 39834a77156..2609a7957aa 100644 --- a/code/modules/admin/verbs/space_transitions.dm +++ b/code/modules/admin/verbs/space_transitions.dm @@ -16,6 +16,8 @@ GLOB.space_manager.do_transition_setup() log_admin("[key_name(usr)] re-assigned all space transitions") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Remake Space Transitions") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! + diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm index 275556eb4da..f279d93fbb6 100644 --- a/code/modules/admin/verbs/striketeam_syndicate.dm +++ b/code/modules/admin/verbs/striketeam_syndicate.dm @@ -94,6 +94,7 @@ GLOBAL_VAR_INIT(sent_syndicate_strike_team, 0) message_admins(span_notice("[key_name_admin(usr)] has spawned a Syndicate strike squad.")) log_admin("[key_name(usr)] used Spawn Syndicate Squad.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Send SST") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /client/proc/create_syndicate_death_commando(obj/spawn_location, is_leader = FALSE) var/mob/living/carbon/human/new_syndicate_commando = new(spawn_location.loc) diff --git a/code/modules/admin/verbs/ticklag.dm b/code/modules/admin/verbs/ticklag.dm index ea6d944b1b9..412b9203af6 100644 --- a/code/modules/admin/verbs/ticklag.dm +++ b/code/modules/admin/verbs/ticklag.dm @@ -12,6 +12,7 @@ if(newtick && newtick <= 2 && newtick > 0) log_and_message_admins("has modified world.tick_lag to [newtick]") world.tick_lag = newtick + SSblackbox.record_feedback("tally", "admin_verb", 1, "Set Ticklag") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! else to_chat(src, "Error: ticklag(): Invalid world.ticklag value. No changes made.") diff --git a/code/modules/admin/verbs/toggledebugverbs.dm b/code/modules/admin/verbs/toggledebugverbs.dm index 45224e1791b..8a9dba35be4 100644 --- a/code/modules/admin/verbs/toggledebugverbs.dm +++ b/code/modules/admin/verbs/toggledebugverbs.dm @@ -31,7 +31,7 @@ GLOBAL_LIST_INIT(admin_verbs_show_debug_verbs, list( remove_verb(src, /client/proc/enable_debug_verbs) add_verb(src, GLOB.admin_verbs_show_debug_verbs + /client/proc/disable_debug_verbs) - + /client/proc/disable_debug_verbs() set category = "Debug" set name = "Debug verbs - Disable" diff --git a/code/modules/antagonists/changeling/powers/absorb.dm b/code/modules/antagonists/changeling/powers/absorb.dm index 5159c7a869a..6c70fd6900a 100644 --- a/code/modules/antagonists/changeling/powers/absorb.dm +++ b/code/modules/antagonists/changeling/powers/absorb.dm @@ -42,6 +42,8 @@ user.visible_message(span_danger("[user] stabs [target] with the proboscis!"), span_notice("We stab [target] with the proboscis.")) to_chat(target, span_danger("You feel a sharp stabbing pain!")) target.take_overall_damage(40) + + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("Absorb DNA", "[stage]")) if(!do_after(user, 15 SECONDS, target, NONE) || !can_sting(user, TRUE)) to_chat(user, span_warning("Our absorption of [target] has been interrupted!")) cling.is_absorbing = FALSE diff --git a/code/modules/antagonists/changeling/powers/biodegrade.dm b/code/modules/antagonists/changeling/powers/biodegrade.dm index 3edb8ab6b2b..5526a57b2bf 100644 --- a/code/modules/antagonists/changeling/powers/biodegrade.dm +++ b/code/modules/antagonists/changeling/powers/biodegrade.dm @@ -95,6 +95,9 @@ user.client?.move_delay = world.time // to skip move delay we probably got from resisting the grab used = TRUE + if(used) + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) + return TRUE diff --git a/code/modules/antagonists/changeling/powers/chameleon_skin.dm b/code/modules/antagonists/changeling/powers/chameleon_skin.dm index 5bdfe8307f5..838a6b5612f 100644 --- a/code/modules/antagonists/changeling/powers/chameleon_skin.dm +++ b/code/modules/antagonists/changeling/powers/chameleon_skin.dm @@ -15,6 +15,8 @@ return FALSE h_owner.force_gene_block(GLOB.chameleonblock, !h_owner.dna.GetSEState(GLOB.chameleonblock)) + + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return TRUE diff --git a/code/modules/antagonists/changeling/powers/digitalcamo.dm b/code/modules/antagonists/changeling/powers/digitalcamo.dm index 6370288d3f3..6f1ad900cb1 100644 --- a/code/modules/antagonists/changeling/powers/digitalcamo.dm +++ b/code/modules/antagonists/changeling/powers/digitalcamo.dm @@ -22,4 +22,6 @@ else ADD_TRAIT(user, TRAIT_AI_UNTRACKABLE, CHANGELING_TRAIT) to_chat(user, span_notice("We distort our form to prevent AI-tracking.")) + + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return TRUE diff --git a/code/modules/antagonists/changeling/powers/epinephrine.dm b/code/modules/antagonists/changeling/powers/epinephrine.dm index 54129519419..ad28b3fac89 100644 --- a/code/modules/antagonists/changeling/powers/epinephrine.dm +++ b/code/modules/antagonists/changeling/powers/epinephrine.dm @@ -27,4 +27,6 @@ user.get_up(instant = TRUE) user.reagents.add_reagent("synaptizine", 20) user.reagents.add_reagent("adrenaline", 2) + + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return TRUE diff --git a/code/modules/antagonists/changeling/powers/fakedeath.dm b/code/modules/antagonists/changeling/powers/fakedeath.dm index ba525c53988..bf513a32420 100644 --- a/code/modules/antagonists/changeling/powers/fakedeath.dm +++ b/code/modules/antagonists/changeling/powers/fakedeath.dm @@ -25,6 +25,7 @@ var/stasis_delay = LING_FAKEDEATH_TIME + cling.fakedeath_delay addtimer(CALLBACK(src, PROC_REF(ready_to_regenerate), user), stasis_delay) to_chat(user, span_changeling("We begin our stasis, preparing energy to arise once more. This process will take [stasis_delay / 10] seconds.")) + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return TRUE diff --git a/code/modules/antagonists/changeling/powers/fleshmend.dm b/code/modules/antagonists/changeling/powers/fleshmend.dm index df2c3fcf1a9..851c35bc9cd 100644 --- a/code/modules/antagonists/changeling/powers/fleshmend.dm +++ b/code/modules/antagonists/changeling/powers/fleshmend.dm @@ -18,6 +18,7 @@ to_chat(user, span_warning("Our healing's effectiveness is reduced by quick repeated use!")) user.apply_status_effect(STATUS_EFFECT_FLESHMEND) + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return TRUE diff --git a/code/modules/antagonists/changeling/powers/headslug.dm b/code/modules/antagonists/changeling/powers/headslug.dm index 68c25aaf007..323a9a63b68 100644 --- a/code/modules/antagonists/changeling/powers/headslug.dm +++ b/code/modules/antagonists/changeling/powers/headslug.dm @@ -37,6 +37,7 @@ addtimer(CALLBACK(src, PROC_REF(headslug_appear), user_mind, our_turf), 0.5 SECONDS) // So it's not killed in explosion user.gib() + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return TRUE diff --git a/code/modules/antagonists/changeling/powers/hivemind.dm b/code/modules/antagonists/changeling/powers/hivemind.dm index ca85b415530..ccf4559a829 100644 --- a/code/modules/antagonists/changeling/powers/hivemind.dm +++ b/code/modules/antagonists/changeling/powers/hivemind.dm @@ -95,6 +95,7 @@ GLOBAL_LIST_EMPTY(hivemind_bank) GLOB.hivemind_bank += chosen_dna to_chat(user, span_notice("We channel the DNA of [chosen_dna.real_name] to the air.")) + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return TRUE @@ -115,5 +116,6 @@ GLOBAL_LIST_EMPTY(hivemind_bank) var/datum/dna/chosen_dna = names[choice] cling.store_dna(chosen_dna) to_chat(user, span_notice("We absorb the DNA of [choice] from the air.")) + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return TRUE diff --git a/code/modules/antagonists/changeling/powers/humanform.dm b/code/modules/antagonists/changeling/powers/humanform.dm index b75ca41d0c0..c5fecb2d198 100644 --- a/code/modules/antagonists/changeling/powers/humanform.dm +++ b/code/modules/antagonists/changeling/powers/humanform.dm @@ -36,5 +36,6 @@ cling.acquired_powers -= src Remove(user) + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return TRUE diff --git a/code/modules/antagonists/changeling/powers/lesserform.dm b/code/modules/antagonists/changeling/powers/lesserform.dm index 7542fb0902b..ce337dca7e4 100644 --- a/code/modules/antagonists/changeling/powers/lesserform.dm +++ b/code/modules/antagonists/changeling/powers/lesserform.dm @@ -30,5 +30,7 @@ user.force_gene_block(GLOB.monkeyblock, TRUE) cling.give_power(new /datum/action/changeling/humanform) + + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return TRUE diff --git a/code/modules/antagonists/changeling/powers/linglink.dm b/code/modules/antagonists/changeling/powers/linglink.dm index 77efa64bdb8..52869af8f88 100644 --- a/code/modules/antagonists/changeling/powers/linglink.dm +++ b/code/modules/antagonists/changeling/powers/linglink.dm @@ -92,6 +92,8 @@ addtimer(CALLBACK(src, PROC_REF(remove_language), target, user), time MINUTES, TIMER_UNIQUE | TIMER_NO_HASH_WAIT | TIMER_OVERRIDE) + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) + return TRUE diff --git a/code/modules/antagonists/changeling/powers/mimic_voice.dm b/code/modules/antagonists/changeling/powers/mimic_voice.dm index f1b2fa0135e..8569f3168e4 100644 --- a/code/modules/antagonists/changeling/powers/mimic_voice.dm +++ b/code/modules/antagonists/changeling/powers/mimic_voice.dm @@ -43,5 +43,7 @@ cling.chem_recharge_slowdown += 0.5 to_chat(user, span_notice("We shape our glands to take the voice of [mimic_voice].")) to_chat(user, span_notice("Use this power again to return to our original voice.")) + + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return TRUE diff --git a/code/modules/antagonists/changeling/powers/panacea.dm b/code/modules/antagonists/changeling/powers/panacea.dm index b5cef6e3806..3e77f3f6343 100644 --- a/code/modules/antagonists/changeling/powers/panacea.dm +++ b/code/modules/antagonists/changeling/powers/panacea.dm @@ -35,5 +35,7 @@ if(virus.severity == NONTHREAT) continue virus.cure() + + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return TRUE diff --git a/code/modules/antagonists/changeling/powers/revive.dm b/code/modules/antagonists/changeling/powers/revive.dm index 2ef5a019ab4..1d0dabcdb89 100644 --- a/code/modules/antagonists/changeling/powers/revive.dm +++ b/code/modules/antagonists/changeling/powers/revive.dm @@ -36,5 +36,6 @@ Remove(user) user.med_hud_set_status() user.med_hud_set_health() + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return TRUE diff --git a/code/modules/antagonists/changeling/powers/shriek.dm b/code/modules/antagonists/changeling/powers/shriek.dm index ad7c28f3129..bbd59fed91d 100644 --- a/code/modules/antagonists/changeling/powers/shriek.dm +++ b/code/modules/antagonists/changeling/powers/shriek.dm @@ -31,6 +31,8 @@ for(var/obj/machinery/light/lamp in range(4, user)) lamp.on = TRUE lamp.break_light_tube() + + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return TRUE diff --git a/code/modules/antagonists/changeling/powers/spiders.dm b/code/modules/antagonists/changeling/powers/spiders.dm index ff66f61c9d1..ae0d3d5140c 100644 --- a/code/modules/antagonists/changeling/powers/spiders.dm +++ b/code/modules/antagonists/changeling/powers/spiders.dm @@ -13,5 +13,7 @@ for(var/i in 1 to 2) var/obj/structure/spider/spiderling/spider = new(user.loc) spider.grow_as = /mob/living/simple_animal/hostile/poison/giant_spider/hunter + + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return TRUE diff --git a/code/modules/antagonists/changeling/powers/strained_muscles.dm b/code/modules/antagonists/changeling/powers/strained_muscles.dm index 8e5d77cf1dc..60ec02cf3a0 100644 --- a/code/modules/antagonists/changeling/powers/strained_muscles.dm +++ b/code/modules/antagonists/changeling/powers/strained_muscles.dm @@ -34,5 +34,7 @@ user.apply_status_effect(STATUS_EFFECT_SPEEDLEGS) else user.remove_status_effect(STATUS_EFFECT_SPEEDLEGS) + + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return TRUE diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index 3955eec3d2a..5084605b452 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -117,6 +117,7 @@ add_attack_logs(user, target, "Extraction sting (changeling)") if(!cling.get_dna(target.dna)) cling.absorb_dna(target) + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return TRUE @@ -197,6 +198,7 @@ span_userdanger("You feel a tiny prick and a begin to uncontrollably convulse!")) addtimer(CALLBACK(src, PROC_REF(victim_transformation), target, selected_dna), 1 SECONDS) + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return TRUE @@ -224,6 +226,7 @@ /datum/action/changeling/sting/mute/sting_action(mob/user, mob/living/carbon/target) add_attack_logs(user, target, "Mute sting (changeling)") target.AdjustSilence(60 SECONDS) + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return TRUE @@ -250,6 +253,7 @@ target.update_nearsighted_effects() target.EyeBlind(40 SECONDS) target.EyeBlurry(80 SECONDS) + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return TRUE @@ -270,6 +274,7 @@ /datum/action/changeling/sting/LSD/sting_action(mob/user, mob/living/carbon/target) add_attack_logs(user, target, "LSD sting (changeling)") addtimer(CALLBACK(src, PROC_REF(start_hallucinations), target, 400 SECONDS), rand(30 SECONDS, 60 SECONDS)) + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return TRUE /datum/action/changeling/sting/LSD/proc/start_hallucinations(mob/living/carbon/target, amount) @@ -296,5 +301,6 @@ if(target.reagents) target.reagents.add_reagent("frostoil", 30) target.reagents.add_reagent("ice", 30) + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return TRUE diff --git a/code/modules/antagonists/changeling/powers/transform.dm b/code/modules/antagonists/changeling/powers/transform.dm index 91c748138ee..dbd22cc42e3 100644 --- a/code/modules/antagonists/changeling/powers/transform.dm +++ b/code/modules/antagonists/changeling/powers/transform.dm @@ -17,5 +17,6 @@ transform_dna(user, chosen_dna) cling.update_languages() + SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]")) return TRUE diff --git a/code/modules/antagonists/vampire/vampire_powers/vampire_powers.dm b/code/modules/antagonists/vampire/vampire_powers/vampire_powers.dm index 7f1239fe0ca..926d6cb651b 100644 --- a/code/modules/antagonists/vampire/vampire_powers/vampire_powers.dm +++ b/code/modules/antagonists/vampire/vampire_powers/vampire_powers.dm @@ -217,6 +217,8 @@ if(subclass_to_add == SUBCLASS_BESTIA) suck_rate = BESTIA_SUCK_RATE check_vampire_upgrade(announce) + if(log_choice) + SSblackbox.record_feedback("nested tally", "vampire_subclasses", 1, list("[new_subclass.name]")) /obj/effect/proc_holder/spell/vampire/glare diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm index c7610c2eee9..11c902ba9bf 100644 --- a/code/modules/cargo/centcom_podlauncher.dm +++ b/code/modules/cargo/centcom_podlauncher.dm @@ -201,11 +201,13 @@ ////////////////////////////UTILITIES////////////////// if("gamePanel") holder.holder.Game() + SSblackbox.record_feedback("tally", "admin_verb", 1, "Game Panel") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! . = TRUE if("buildMode") var/mob/holder_mob = holder.mob if (holder_mob && (check_rights(R_BUILDMODE, user = holder_mob))) togglebuildmode(holder_mob) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle Build Mode") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! . = TRUE if("loadDataFromPreset") var/list/savedData = params["payload"] diff --git a/code/modules/client/preference/preferences_toggles.dm b/code/modules/client/preference/preferences_toggles.dm index e50264ca1b2..a7ae2576650 100644 --- a/code/modules/client/preference/preferences_toggles.dm +++ b/code/modules/client/preference/preferences_toggles.dm @@ -21,6 +21,8 @@ var/enable_message /// Message to display when this toggle is disabled var/disable_message + /// Message for the blackbox, legacy verbs so we can't just use the name + var/blackbox_message /// Rights required to be able to use this pref option var/rights_required @@ -38,6 +40,8 @@ if(PREFTOGGLE_SOUND) our_prefs.sound ^= preftoggle_bitflag to_chat(user, "[(our_prefs.sound & preftoggle_bitflag) ? enable_message : disable_message]") + + SSblackbox.record_feedback("tally", "toggle_verbs", 1, blackbox_message) our_prefs.save_preferences(user) /datum/preference_toggle/toggle_ghost_ears @@ -48,6 +52,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GHOST enable_message = "As a ghost, you will now only see speech from nearby mobs." disable_message = "As a ghost, you will now see all speech in the world." + blackbox_message = "Toggle GhostEars" /datum/preference_toggle/toggle_ghost_sight name = "Toggle Ghost Emote Viewing" @@ -57,6 +62,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GHOST enable_message = "As a ghost, you will now only see speech from nearby mobs." disable_message = "As a ghost, you will now see all emotes in the world." + blackbox_message = "Toggle GhostSight" /datum/preference_toggle/toggle_ghost_radio name = "Toggle Ghost Radio" @@ -66,6 +72,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GHOST enable_message = "As a ghost, you will now only hear from nearby speakers." disable_message = "As a ghost, you will now hear all radio chat in the world." + blackbox_message = "Toggle GhostRadio" /datum/preference_toggle/toggle_admin_radio name = "Admin Radio" @@ -76,6 +83,7 @@ rights_required = R_ADMIN enable_message = "You will no longer see radio chatter from radios or speakers." disable_message = "You will now see radio chatter from radios or speakers." + blackbox_message = "Toggle RadioChatter" /datum/preference_toggle/toggle_ai_voice_annoucements name = "AI Voice Announcements" @@ -85,6 +93,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GENERAL enable_message = "You will now hear AI announcements." disable_message = "You will now hear AI announcements." + blackbox_message = "Toggle AI Voice" /datum/preference_toggle/toggle_admin_pm_sound name = "Admin PM sound" @@ -95,6 +104,7 @@ rights_required = R_ADMIN enable_message = "You will now hear a sound when adminhelp is sent." disable_message = "You will no longer hear a sound when adminhelp is sent." + blackbox_message = "Toggle Admin Bwoinks" /datum/preference_toggle/toggle_mentor_pm_sound name = "Mentor PM sound" @@ -105,6 +115,7 @@ rights_required = R_MENTOR enable_message = "You will now hear a sound when mentorhelp is sent." disable_message = "You will no longer hear a sound when mentorhelp is sent." + blackbox_message = "Toggle Mentor Bwoinks" /datum/preference_toggle/toggle_deadchat_visibility name = "Toggle Deadchat visibility" @@ -114,6 +125,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GENERAL enable_message = "You will now see deadchat." disable_message = "You will no longer see deadchat." + blackbox_message = "Toggle Deadchat" /datum/preference_toggle/end_of_round_scoreboard name = "Toggle the End of Round Scoreboard" @@ -123,6 +135,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GENERAL enable_message = "You will now see the end of round scoreboard." disable_message = "You will no longer see see the end of round scoreboard." + blackbox_message = "Toggle Scoreboard" /datum/preference_toggle/title_music name = "Toggle Lobby Music" @@ -132,6 +145,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GENERAL enable_message = "You will now hear music in the game lobby." disable_message = "You will no longer hear music in the game lobby." + blackbox_message = "Toggle Lobby Music" /datum/preference_toggle/title_music/set_toggles(client/user) . = ..() @@ -150,6 +164,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GENERAL enable_message = "You will now hear any sounds uploaded by admins." disable_message = "You will no longer hear sounds uploaded by admins; any currently playing midis have been disabled." + blackbox_message = "Toggle MIDIs" /datum/preference_toggle/toggle_admin_midis/set_toggles(client/user) . = ..() @@ -164,6 +179,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GENERAL enable_message = "You will now see the OOC channel." disable_message = "You will no longer see the OOC channel." + blackbox_message = "Toggle OOC" /datum/preference_toggle/toggle_looc name = "Toggle LOOC chat" @@ -173,6 +189,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GENERAL enable_message = "You will now see the LOOC channel." disable_message = "You will no longer see the LOOC channel." + blackbox_message = "Toggle LOOC" /datum/preference_toggle/toggle_ambience name = "Toggle Ambient sounds" @@ -182,6 +199,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GENERAL enable_message = "You now hear ambient sounds." disable_message = "Ambience is now silenced." + blackbox_message = "Toggle Ambience" /datum/preference_toggle/toggle_ambience/set_toggles(client/user) . = ..() @@ -197,6 +215,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GENERAL enable_message = "You will now hear ambient white noise." disable_message = "You will no longer hear ambient white noise." + blackbox_message = "Toggle Whitenoise" /datum/preference_toggle/toggle_white_noise/set_toggles(client/user) . = ..() @@ -211,6 +230,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GENERAL enable_message = "You will now hear heartbeat sounds." disable_message = "You will no longer hear heartbeat sounds." + blackbox_message = "Toggle Hearbeat" /datum/preference_toggle/toggle_heartbeat_noise/set_toggles(client/user) . = ..() @@ -225,6 +245,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GENERAL enable_message = "You will now hear people playing musical instruments." disable_message = "You will no longer hear musical instruments." + blackbox_message = "Toggle Instruments" /datum/preference_toggle/toggle_disco name = "Toggle Disco Machine Music" @@ -234,6 +255,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GENERAL enable_message = "You will now hear and dance to the radiant dance machine." disable_message = "You will no longer hear or dance to the radiant dance machine." + blackbox_message = "Toggle Dance Machine" /datum/preference_toggle/toggle_disco/set_toggles(client/user) . = ..() @@ -248,6 +270,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GHOST enable_message = "As a ghost, you will now see all PDA messages." disable_message = "As a ghost, you will no longer see PDA messages." + blackbox_message = "Toggle Ghost PDA" /client/verb/silence_current_midi() set name = "Silence Current Midi" @@ -264,6 +287,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GENERAL enable_message = "You will now see runechat." disable_message = "You will no longer see runechat." + blackbox_message = "Toggle Runechat" /datum/preference_toggle/toggle_ghost_death_notifs name = "Toggle Ghost Death Notifications" @@ -273,6 +297,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GHOST enable_message = "You will now see a notification in deadchat when a player dies." disable_message = "You will no longer see a notification in deadchat when a player dies." + blackbox_message = "Toggle Death Notifications" /datum/preference_toggle/toggle_reverb name = "Toggle Reverb" @@ -282,6 +307,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GENERAL enable_message = "You will now get reverb on some in game sounds." disable_message = "You will no longer get reverb on some in game sounds." + blackbox_message = "Toggle reverb" /datum/preference_toggle/toggle_simple_stat_panel name = "Toggle item outlines" @@ -291,6 +317,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_LIVING enable_message = "You no longer see item outlines when hovering over an item with your mouse." disable_message = "You now see item outlines when hovering over an item with your mouse." + blackbox_message = "Toggle item outlines" /datum/preference_toggle/toggle_anonmode name = "Toggle Anonymous Mode" @@ -300,6 +327,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GENERAL enable_message = "Your key will no longer be shown in certain events (end round reports, deadchat, etc)." disable_message = "Your key will now will be shown in certain events (end round reports, deadchat, etc)." + blackbox_message = "Toggle Anon mode" /datum/preference_toggle/toggle_typing_indicator name = "Toggle Typing Indicator" @@ -309,6 +337,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_LIVING enable_message = "You will no longer display a typing indicator." disable_message = "You will now display a typing indicator." + blackbox_message = "Toggle Typing Indicator (Speech)" /datum/preference_toggle/toggle_typing_indicator/set_toggles(client/user) . = ..() @@ -325,6 +354,7 @@ rights_required = R_ADMIN enable_message = "Admin logs disabled." disable_message = "Admin logs re-enabled." + blackbox_message = "Admin logs toggled" /datum/preference_toggle/toggle_mhelp_notification name = "Toggle Mentor Ticket Messages" @@ -335,6 +365,7 @@ rights_required = R_MENTOR | R_ADMIN enable_message = "You now won't get mentor ticket messages." disable_message = "You now will get mentor ticket messages." + blackbox_message = "Mentor ticket notification toggled" /datum/preference_toggle/toggle_ahelp_notification name = "Toggle Admin Ticket Messages" @@ -345,6 +376,7 @@ rights_required = R_ADMIN enable_message = "You now won't get admin ticket messages." disable_message = "You now will get admin ticket messages." + blackbox_message = "Admin ticket notification toggled" /datum/preference_toggle/toggle_debug_logs name = "Toggle Debug Log Messages" @@ -355,6 +387,7 @@ rights_required = R_VIEWRUNTIMES | R_DEBUG enable_message = "You now won't get debug logs." disable_message = "You now will get debug logs." + blackbox_message = "Debug logs toggled" /datum/preference_toggle/toggle_mctabs name = "Toggle MC tab" @@ -365,6 +398,7 @@ rights_required = R_VIEWRUNTIMES | R_DEBUG enable_message = "You'll now see subsystem information in the verb panel." disable_message = "You'll no longer see subsystem information in the verb panel." + blackbox_message = "MC tabs toggled" /datum/preference_toggle/toggle_split_admins_tabs name = "Toggle Split Admins Tabs" @@ -375,17 +409,20 @@ rights_required = R_ADMIN enable_message = "Теперь ваши вербы разделены по подкатегориям." disable_message = "Теперь ваши вербы не разделены по подкатегориям." + blackbox_message = "Split Admins Tabs toggled" /datum/preference_toggle/special_toggle preftoggle_toggle = PREFTOGGLE_SPECIAL /datum/preference_toggle/special_toggle/set_toggles(client/user) + SSblackbox.record_feedback("tally", "toggle_verbs", 1, blackbox_message) user.prefs.save_preferences(user) // /datum/preference_toggle/special_toggle/toggle_adminsound_mutes // name = "Manage Admin Sound Mutes" // description = "Manage admins that you wont hear played audio from" // preftoggle_category = PREFTOGGLE_CATEGORY_GENERAL +// blackbox_message = "MC tabs toggled" // /datum/preference_toggle/special_toggle/toggle_adminsound_mutes/set_toggles(client/user) // if(!length(user.prefs.admin_sound_ckey_ignore)) @@ -405,6 +442,7 @@ description = "Pick a custom OOC color" preftoggle_category = PREFTOGGLE_CATEGORY_ADMIN rights_required = R_ADMIN | R_DEBUG + blackbox_message = "Set Own OOC" /datum/preference_toggle/special_toggle/set_ooc_color/set_toggles(client/user) var/new_ooccolor = tgui_input_color(usr, "Please select your OOC color.", "OOC color", user.prefs.ooccolor) @@ -421,6 +459,7 @@ description = "Changes what attack logs you see, ranges from all attacklogs to no attacklogs" preftoggle_category = PREFTOGGLE_CATEGORY_ADMIN rights_required = R_ADMIN + blackbox_message = "changed attack log settings" /datum/preference_toggle/special_toggle/set_attack_logs/set_toggles(client/user) var/static/list/attack_log_settings = list("All attack logs" = ATKLOG_ALL, "Almost all attack logs" = ATKLOG_ALMOSTALL, "Most attack logs" = ATKLOG_MOST, "Few attack logs" = ATKLOG_FEW, "No attack logs" = ATKLOG_NONE) @@ -464,6 +503,7 @@ rights_required = R_ADMIN enable_message = "You will now see prayerchat." disable_message = "You will no longer see prayerchat." + blackbox_message = "Toggle Prayers" /datum/preference_toggle/toggle_prayers_notify name = "Toggle Prayers Notify" @@ -474,6 +514,7 @@ rights_required = R_ADMIN enable_message = "You will now hear when prayers are made." disable_message = "You will no longer hear when prayers are made." + blackbox_message = "Toggle Prayer Sound" /datum/preference_toggle/toggle_karma_reminder name = "Toggle End Round Karma Reminder" @@ -483,6 +524,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GENERAL enable_message = "You will now see the end of round karma reminder." disable_message = "You will no longer see the end of round karma reminder." + blackbox_message = "Toggle Karma Reminder" /datum/preference_toggle/toggle_parallax_multiz name = "Toggle Parallax Multi-Z" @@ -492,6 +534,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GENERAL enable_message = "You will now see 3D effect of multi-z parallax." disable_message = "You will no longer see 3D effect of multi-z parallax." + blackbox_message = "Toggle Parallax Multi-Z" /datum/preference_toggle/toggle_parallax_multiz/set_toggles(client/user) . = ..() @@ -511,6 +554,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GENERAL enable_message = "You will now receive popups when vote starts." disable_message = "You will no longer receive popups when vote starts." + blackbox_message = "Toggle Vote Popup" // /datum/preference_toggle/toggle_emote_indicator // name = "Toggle Emote Typing Indicator" @@ -520,6 +564,7 @@ // preftoggle_category = PREFTOGGLE_CATEGORY_GENERAL // enable_message = "You will now display a typing indicator for emotes." // disable_message = "You will no longer display a typing indicator for emotes." +// blackbox_message = "Toggle Typing Indicator (Emote)" // /datum/preference_toggle/toggle_emote_indicator/set_toggles(client/user) // . = ..() @@ -535,6 +580,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GENERAL enable_message = "You will no longer use TGUI Input." disable_message = "You will now use TGUI Input." + blackbox_message = "Toggle TGUI Input" /datum/preference_toggle/toggle_strip_tgui_size name = "Toggle TGUI strip menu size" @@ -544,6 +590,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GENERAL enable_message = "You will see full-size TGUI strip menu." disable_message = "You will see minuature TGUI strip menu." + blackbox_message = "Toggle TGUI strip menu size" /datum/preference_toggle/toggle_item_descritpion_tips name = "Toggle item description tips" @@ -553,6 +600,7 @@ preftoggle_category = PREFTOGGLE_CATEGORY_LIVING enable_message = "You will see item description tips now." disable_message = "You will not see item description tips now." + blackbox_message = "Toggle item description tips on hover" /datum/preference_toggle/toggle_take_out_of_the_round_without_obj name = "Вывод из игры без цели" @@ -562,3 +610,5 @@ preftoggle_category = PREFTOGGLE_CATEGORY_GENERAL enable_message = "Другие игроки теперь имеют право выводить вас из раунда без цели." disable_message = "Другие игроки больше не имеют права выводить вас из раунда без цели." + blackbox_message = "Переключение разрешения выводить игрока из раунда" + diff --git a/code/modules/crafting/craft.dm b/code/modules/crafting/craft.dm index 645b5c55715..9050d863827 100644 --- a/code/modules/crafting/craft.dm +++ b/code/modules/crafting/craft.dm @@ -147,6 +147,7 @@ /datum/personal_crafting/proc/construct_item(mob/user, datum/crafting_recipe/R) var/list/contents = get_surroundings(user) + var/send_feedback = 1 if(!check_contents(R, contents)) return ", missing component." if(!check_tools(user, R, contents)) @@ -179,6 +180,9 @@ I.CheckParts(parts, R) if(isitem(I)) user.put_in_hands(I) + + if(send_feedback) + SSblackbox.record_feedback("tally", "object_crafted", 1, I.type) return 0 /datum/personal_crafting/proc/requirements_deletion(datum/crafting_recipe/recipe, mob/user) diff --git a/code/modules/events/event_procs.dm b/code/modules/events/event_procs.dm index 01aff3ba871..13970715d40 100644 --- a/code/modules/events/event_procs.dm +++ b/code/modules/events/event_procs.dm @@ -15,6 +15,7 @@ set category = "Admin.Event" if(SSevents) SSevents.Interact(usr) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Event Manager") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! return diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index 9559731c603..9535184449d 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -121,6 +121,7 @@ return for(var/i in 1 to (C+processor.rating_amount-1)) new S.coretype(processor.drop_location()) + SSblackbox.record_feedback("tally", "slime_core_harvested", 1, S.colour) ..() /datum/food_processor_process/mob/monkey diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index e2160011cdc..f5457492612 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -154,12 +154,16 @@ GLOBAL_LIST_EMPTY(plant_seeds) var/t_amount = 0 var/list/result = list() var/output_loc = parent.Adjacent(user) ? user.loc : parent.loc //needed for TK + var/product_name while(t_amount < getYield()) var/obj/item/reagent_containers/food/snacks/grown/t_prod = new product(output_loc, src) result.Add(t_prod) // User gets a consumable if(!t_prod) return t_amount++ + product_name = t_prod.name + if(getYield() >= 1) + SSblackbox.record_feedback("tally", "food_harvested", getYield(), product_name) parent.update_tray() return result diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm index c27a3e449d8..f5e4e53df4b 100644 --- a/code/modules/mining/equipment/regenerative_core.dm +++ b/code/modules/mining/equipment/regenerative_core.dm @@ -45,11 +45,16 @@ preserved = TRUE update_icon() desc = "All that remains of a hivelord. It is preserved, allowing you to use it to heal completely without danger of decay." + if(implanted) + SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "implanted")) + else + SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "stabilizer")) /obj/item/organ/internal/regenerative_core/proc/go_inert() inert = TRUE name = "decayed regenerative core" desc = "All that remains of a hivelord. It has decayed, and is completely useless." + SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "inert")) update_icon() /obj/item/organ/internal/regenerative_core/ui_action_click(mob/user, datum/action/action, leftclick) @@ -77,8 +82,10 @@ return if(H != user) H.visible_message("[user] forces [H] to apply [src]... Black tendrils entangle and reinforce [H.p_them()]!") + SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "other")) else to_chat(user, span_notice("You start to smear [src] on yourself. Disgusting tendrils hold you together and allow you to keep moving, but for how long?")) + SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self")) H.apply_status_effect(STATUS_EFFECT_REGENERATIVE_CORE) user.temporarily_remove_item_from_inventory(src) qdel(src) @@ -199,8 +206,10 @@ span_warning("[user] forces [target] to apply [src]... Black tendrils entangle and reinforce [target.p_them()]!"), span_notice("You have forced [target] to apply [src]... Black tendrils entangle and reinforce [target.p_them()]!"), ) + SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "other")) else to_chat(user, span_notice("You start to smear [src] on yourself. Disgusting tendrils hold you together and allow you to keep moving, but for how long?")) + SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self")) target.apply_status_effect(STATUS_EFFECT_REGENERATIVE_CORE) qdel(src) diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm index c5bae779076..6090e583947 100644 --- a/code/modules/mining/equipment/wormhole_jaunter.dm +++ b/code/modules/mining/equipment/wormhole_jaunter.dm @@ -16,6 +16,7 @@ /obj/item/wormhole_jaunter/attack_self(mob/user) user.visible_message(span_notice("[user.name] activates the [name]!")) + SSblackbox.record_feedback("tally", "jaunter", 1, "User") // user activated activate(user, TRUE) @@ -66,6 +67,7 @@ if(!.) to_chat(user, span_notice("Your [name] activates, saving you from the chasm!")) + SSblackbox.record_feedback("tally", "jaunter", 1, "Chasm") // chasm automatic activation /obj/item/wormhole_jaunter/emag_act(mob/user) diff --git a/code/modules/mining/lavaland/loot/tendril_loot.dm b/code/modules/mining/lavaland/loot/tendril_loot.dm index d011cc3f818..1a312d331fb 100644 --- a/code/modules/mining/lavaland/loot/tendril_loot.dm +++ b/code/modules/mining/lavaland/loot/tendril_loot.dm @@ -144,10 +144,10 @@ /obj/item/book_of_babel/attack_self(mob/living/carbon/user) if(HAS_TRAIT(user, TRAIT_NO_BABEL)) user.visible_message( - span_notice("[user] внезапно останавлива[pluralize_ru(user, "ет", "ют")]ся, недоумённо глядя на [declent_ru(GENITIVE)]."), + span_notice("[user] внезапно останавлива[pluralize_ru(user, "ет", "ют")]ся, недоумённо глядя на [declent_ru(GENITIVE)]."), span_warning("Вы понятия не имеете, что это такое и что с этим делать.") ) - + return to_chat(user, "Вы упоённо пролистываете страницы книги, вбирая в себя знания всех существующих языков во Вселенной. К сожалению, [declent_ru(NOMINATIVE)] не выдерживает такого напора и рассыпается в прах. Ой...") @@ -294,6 +294,8 @@ set_light_on(FALSE) user.update_sight() + + SSblackbox.record_feedback("tally", "wisp_lantern", 1, "Freed") // freed else UnregisterSignal(user, COMSIG_MOB_UPDATE_SIGHT) @@ -305,6 +307,7 @@ user.update_sight() update_icon(UPDATE_ICON_STATE) + SSblackbox.record_feedback("tally", "wisp_lantern", 1, "Returned") // returned /obj/item/wisp_lantern/Initialize(mapload) . = ..() @@ -376,6 +379,7 @@ smoke.start() user.forceMove(get_turf(linked)) + SSblackbox.record_feedback("tally", "warp_cube", 1, type) var/datum/effect_system/smoke_spread/smoke2 = new smoke2.set_up(1, 0, user.loc) @@ -514,6 +518,7 @@ return COOLDOWN_START(src, last_used_immortality_talisman, 60 SECONDS) + SSblackbox.record_feedback("amount", "immortality_talisman_uses", 1) user.visible_message(span_danger("[user] исчеза[pluralize_ru(user, "ет", "ют")] из реальности, оставляя после себя дыру в пространстве!")) var/obj/effect/immortality_talisman/effect = new(source_turf) diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 8542c7b6dbf..e3af77d3145 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -93,6 +93,7 @@ update_appearance(UPDATE_ICON_STATE|UPDATE_NAME) if(radio_action) radio_action.UpdateButtonIcon() + SSblackbox.record_feedback("amount", "mmis_filled", 1) return ATTACK_CHAIN_BLOCKED_ALL if(istype(I, /obj/item/mmi_radio_upgrade)) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index be5e95bcac5..ff6e8d6f2ae 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -92,6 +92,10 @@ //Handle species-specific deaths. dna.species.handle_death(gibbed, src) + if(SSticker && SSticker.mode) + SSblackbox.ReportDeath(src) + + /mob/living/carbon/human/update_revive(updating, defib_revive) . = ..() if(. && healthdoll) diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index f55ab82783f..3ce665ce098 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -70,3 +70,5 @@ RC.go_out() update_icons() + + SSblackbox.ReportDeath(src) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index b8afbe3c748..5bd7a375662 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -411,6 +411,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list( hands.icon_state = lowertext(module.module_type) + SSblackbox.record_feedback("tally", "cyborg_modtype", 1, "[lowertext(modtype)]") rename_character(real_name, get_default_name()) choose_icon() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index e265b46b8ba..4b250d58fbe 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -94,6 +94,7 @@ loot += enraged_loot //Disk for each miner / borg. if(!elimination) //used so the achievment only occurs for the last legion to die. grant_achievement(medal_type,score_type) + SSblackbox.record_feedback("tally", "megafauna_kills", 1, "[initial(name)]") return ..() /mob/living/simple_animal/hostile/megafauna/proc/spawn_crusher_loot() diff --git a/code/modules/mob/living/simple_animal/hostile/mining/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining/elites/elite.dm index d66fee5aa2a..03b43717429 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining/elites/elite.dm @@ -448,6 +448,9 @@ While using this makes the system rely on OnFire, it still gives options for tim lootloc = new /obj/structure/closet/crate/necropolis/tendril(loc) new /obj/item/tumor_shard(lootloc) to_chat(mychild, "Dont leave your body, if you want to be revived.") + SSblackbox.record_feedback("tally", "Player controlled Elite loss", 1, mychild.name) + else + SSblackbox.record_feedback("tally", "AI controlled Elite loss", 1, mychild.name) new mychild.loot_drop(lootloc) mychild.dif_mult = 1 mychild.dif_mult_dmg = 1 @@ -467,7 +470,10 @@ While using this makes the system rely on OnFire, it still gives options for tim if(boosted) copy.boosted = TRUE copy.update_icon(UPDATE_ICON_STATE) + SSblackbox.record_feedback("tally", "Player controlled Elite win", 1, mychild.name) times_won++ + else + SSblackbox.record_feedback("tally", "AI controlled Elite win", 1, mychild.name) qdel(src) /obj/item/tumor_shard diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm index 652fce9c7c6..8bc3dd9be1e 100644 --- a/code/modules/mob/living/simple_animal/slime/powers.dm +++ b/code/modules/mob/living/simple_animal/slime/powers.dm @@ -279,6 +279,7 @@ babies += M if(can_mutate) M.mutation_chance = clamp(mutation_chance+(rand(5,-5)),0,100) + SSblackbox.record_feedback("tally", "slime_babies_born", 1, M.colour) /datum/action/innate/slime/reproduce name = "Reproduce" diff --git a/code/modules/newscaster/obj/newscaster.dm b/code/modules/newscaster/obj/newscaster.dm index e28abc3c704..b0c47a59881 100644 --- a/code/modules/newscaster/obj/newscaster.dm +++ b/code/modules/newscaster/obj/newscaster.dm @@ -503,6 +503,7 @@ return FC = new GLOB.news_network.channels += FC + SSblackbox.record_feedback("amount", "newscaster_channels", 1) // Redirect screen = NEWSCASTER_CHANNEL viewing_channel = FC @@ -539,6 +540,7 @@ FM.admin_locked = usr.can_admin_interact() && admin_locked // Register it FC.add_message(FM) + SSblackbox.record_feedback("amount", "newscaster_stories", 1) var/announcement = FC.get_announce_text(title) // Announce it for(var/nc in GLOB.allNewscasters) @@ -655,6 +657,7 @@ if(paper_remaining <= 0 || is_printing) return paper_remaining-- + SSblackbox.record_feedback("amount", "newscaster_newspapers_printed",1) // Print it is_printing = TRUE playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, TRUE) diff --git a/code/modules/paperwork/fax.dm b/code/modules/paperwork/fax.dm index 90beef415db..caa9f07f02d 100644 --- a/code/modules/paperwork/fax.dm +++ b/code/modules/paperwork/fax.dm @@ -28,6 +28,7 @@ GLOBAL_LIST_EMPTY(adminfaxes) return if(holder) holder.fax_panel(usr) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Fax Panel") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! return /datum/admins/proc/fax_panel(var/mob/living/user) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 89a5f42be32..efc860d4026 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -360,6 +360,7 @@ user.update_inv_l_hand() else user.update_inv_r_hand() + SSblackbox.record_feedback("tally", "gun_fired", 1, type) if(rusted_weapon) malf_counter -= burst_size diff --git a/code/modules/projectiles/guns/medbeam.dm b/code/modules/projectiles/guns/medbeam.dm index 83bdaf5cafd..ff0e97b4e2b 100644 --- a/code/modules/projectiles/guns/medbeam.dm +++ b/code/modules/projectiles/guns/medbeam.dm @@ -98,6 +98,8 @@ active = TRUE current_beam = user.Beam(current_target, icon_state = "medbeam", time = 10 MINUTES, maxdistance = max_range, beam_type = /obj/effect/ebeam/medical) RegisterSignal(current_beam, COMSIG_QDELETING, PROC_REF(beam_died)) // this is a WAY better rangecheck than what was done before (process check) + + SSblackbox.record_feedback("tally", "gun_fired", 1, type) return TRUE /obj/item/gun/medbeam/process() diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 1478e43c9f3..a1f4b1299a8 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -449,6 +449,7 @@ var/created_volume = C.result_amount*multiplier if(C.result) + SSblackbox.record_feedback("tally", "chemical_reaction", C.result_amount * multiplier, C.result) multiplier = max(multiplier, 1) //this shouldnt happen ... add_reagent(C.result, C.result_amount*multiplier) set_data(C.result, preserved_data) diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 7c2b14b31fe..709022b6ab3 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -10,6 +10,7 @@ required_other = 1 /datum/chemical_reaction/slimespawn/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/mob/living/simple_animal/slime/S = new(get_turf(holder.my_atom), "grey") S.visible_message("Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!") @@ -22,6 +23,9 @@ required_other = 1 required_container = /obj/item/slime_extract/grey +/datum/chemical_reaction/slimeinaprov/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) + /datum/chemical_reaction/slimemonkey name = "Slime Monkey" id = "m_monkey" @@ -32,6 +36,7 @@ required_other = 1 /datum/chemical_reaction/slimemonkey/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) for(var/i = 1, i <= 3, i++) var/obj/item/reagent_containers/food/snacks/monkeycube/M = new M.forceMove(get_turf(holder.my_atom)) @@ -46,6 +51,9 @@ required_other = 1 required_container = /obj/item/slime_extract/green +/datum/chemical_reaction/slimemutate/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) + /datum/chemical_reaction/slimepotionbio name = "Slime Bio Resistence Potion" id = "m_slime_potion_BioR" @@ -56,6 +64,7 @@ required_other = 1 /datum/chemical_reaction/slimepotionbio/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/obj/item/slimepotion/clothing/bio/B = new B.forceMove(get_turf(holder.my_atom)) @@ -70,6 +79,7 @@ required_other = 1 /datum/chemical_reaction/slimemetal/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/turf/location = get_turf(holder.my_atom) new /obj/item/stack/sheet/plasteel (location, 5) new /obj/item/stack/sheet/metal (location, 15) @@ -84,6 +94,7 @@ required_other = 1 /datum/chemical_reaction/slimeglass/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/turf/location = get_turf(holder.my_atom) new /obj/item/stack/sheet/rglass (location, 5) new /obj/item/stack/sheet/glass (location, 15) @@ -99,6 +110,7 @@ required_other = TRUE /datum/chemical_reaction/slimemobspawn/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/turf/T = get_turf(holder.my_atom) summon_mobs(holder, T) @@ -147,6 +159,8 @@ required_other = 1 /datum/chemical_reaction/slimebork/on_reaction(datum/reagents/holder) + + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/list/blocked = list(/obj/item/reagent_containers/food/snacks, /obj/item/reagent_containers/food/snacks/breadslice, /obj/item/reagent_containers/food/snacks/sliceable, @@ -192,6 +206,8 @@ required_other = 1 /datum/chemical_reaction/slimebork2/on_reaction(datum/reagents/holder) + + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/list/borks = subtypesof(/obj/item/reagent_containers/food/drinks) var/list/blocked = list(/obj/item/reagent_containers/food/drinks/cans/adminbooze, /obj/item/reagent_containers/food/drinks/cans/madminmalt, @@ -235,6 +251,9 @@ required_container = /obj/item/slime_extract/blue required_other = 1 +/datum/chemical_reaction/slimefrost/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) + /datum/chemical_reaction/slimestabilizer name = "Slime Stabilizer" id = "m_slimestabilizer" @@ -245,6 +264,7 @@ required_other = 1 /datum/chemical_reaction/slimestabilizer/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/obj/item/slimepotion/slime/stabilizer/P = new P.forceMove(get_turf(holder.my_atom)) @@ -260,6 +280,7 @@ /datum/chemical_reaction/slimefreeze/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/turf/T = get_turf(holder.my_atom) T.visible_message(span_danger("The slime extract begins to vibrate adorably!")) addtimer(CALLBACK(src, PROC_REF(delayed_freeze), holder), 5 SECONDS) @@ -284,6 +305,7 @@ required_other = 1 /datum/chemical_reaction/slimefireproof/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/obj/item/slimepotion/clothing/fireproof/P = new P.forceMove(get_turf(holder.my_atom)) @@ -297,6 +319,8 @@ required_container = /obj/item/slime_extract/orange required_other = 1 +/datum/chemical_reaction/slimecasp/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) /datum/chemical_reaction/slimefire name = "Slime fire" @@ -308,6 +332,7 @@ required_other = 1 /datum/chemical_reaction/slimefire/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/turf/TU = get_turf(holder.my_atom) TU.visible_message("The slime extract begins to vibrate adorably !") spawn(50) @@ -328,6 +353,7 @@ required_other = 1 /datum/chemical_reaction/slimeoverload/on_reaction(datum/reagents/holder, created_volume) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) empulse(get_turf(holder.my_atom), 3, 7, TRUE, "Slime core") @@ -341,6 +367,7 @@ required_other = 1 /datum/chemical_reaction/slimecell/on_reaction(datum/reagents/holder, created_volume) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/obj/item/stock_parts/cell/high/slime/P = new P.forceMove(get_turf(holder.my_atom)) @@ -354,6 +381,7 @@ required_other = 1 /datum/chemical_reaction/slimeglow/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/turf/T = get_turf(holder.my_atom) T.visible_message("The slime begins to emit a soft light. Squeezing it will cause it to grow brightly.") var/obj/item/flashlight/slime/F = new @@ -371,6 +399,7 @@ required_other = 1 /datum/chemical_reaction/slimepsteroid/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/obj/item/slimepotion/slime/steroid/P = new P.forceMove(get_turf(holder.my_atom)) @@ -383,6 +412,8 @@ required_container = /obj/item/slime_extract/purple required_other = 1 +/datum/chemical_reaction/slimejam/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) //Dark Purple @@ -396,6 +427,7 @@ required_other = 1 /datum/chemical_reaction/slimeplasma/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/turf/location = get_turf(holder.my_atom) new /obj/item/stack/sheet/mineral/plasma (location, 3) @@ -409,6 +441,7 @@ required_other = 1 /datum/chemical_reaction/slimeplasmaglass/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/turf/location = get_turf(holder.my_atom) new /obj/item/stack/sheet/plasmaglass (location, 2) @@ -423,6 +456,7 @@ required_other = 1 /datum/chemical_reaction/slimemutator/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/obj/item/slimepotion/slime/mutator/P = new P.forceMove(get_turf(holder.my_atom)) @@ -436,6 +470,7 @@ required_other = 1 /datum/chemical_reaction/slimebloodlust/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null)) if(slime.docile) //Undoes docility, but doesn't make rabid. slime.visible_message("[slime] forgets its training, becoming wild once again!") @@ -456,6 +491,7 @@ required_other = 1 /datum/chemical_reaction/slimespeed/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/obj/item/slimepotion/speed/P = new P.forceMove(get_turf(holder.my_atom)) @@ -471,6 +507,7 @@ required_other = 1 /datum/chemical_reaction/docility/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/obj/item/slimepotion/slime/docility/P = new P.forceMove(get_turf(holder.my_atom)) @@ -484,6 +521,8 @@ required_other = 1 required_container = /obj/item/slime_extract/black +/datum/chemical_reaction/slimemutate2/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) /datum/chemical_reaction/slimeacid name = "Slime Acid Resistence Potion" @@ -495,6 +534,7 @@ required_other = 1 /datum/chemical_reaction/slimeacid/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/obj/item/slimepotion/clothing/acidproof/A = new A.forceMove(get_turf(holder.my_atom)) @@ -509,6 +549,7 @@ required_other = 1 /datum/chemical_reaction/slimeexplosion/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/turf/T = get_turf(holder.my_atom) message_admins("[ADMIN_LOOKUPFLW(usr)] has primed a [name] for detonation at [ADMIN_VERBOSEJMP(T)]") add_attack_logs(usr, src, "has primed for detonation", ATKLOG_MOST) @@ -527,6 +568,7 @@ required_other = 1 /datum/chemical_reaction/slimepotionexplosion/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/obj/item/slimepotion/clothing/explosionresistencte/E = new E.forceMove(get_turf(holder.my_atom)) @@ -541,6 +583,7 @@ required_other = 1 /datum/chemical_reaction/slimepotion2/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/obj/item/slimepotion/sentience/P = new P.forceMove(get_turf(holder.my_atom)) @@ -555,6 +598,7 @@ required_other = 1 /datum/chemical_reaction/slimegolem/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) new /obj/item/stack/sheet/mineral/adamantine(get_turf(holder.my_atom)) /datum/chemical_reaction/moenkeylanguage @@ -566,6 +610,8 @@ required_container = /obj/item/slime_extract/pink required_other = 1 +/datum/chemical_reaction/moenkeylanguage/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) /datum/chemical_reaction/slimedamage name = "Slime Damage Resistence Potion" @@ -577,6 +623,7 @@ required_other = 1 /datum/chemical_reaction/slimedamage/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/obj/item/slimepotion/clothing/damage/D = new D.forceMove(get_turf(holder.my_atom)) @@ -591,6 +638,7 @@ required_other = 1 /datum/chemical_reaction/slimefloor2/on_reaction(datum/reagents/holder, created_volume) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) new /obj/item/stack/tile/bluespace(get_turf(holder.my_atom), 25) /datum/chemical_reaction/slimeteleportation @@ -603,6 +651,7 @@ required_other = 1 /datum/chemical_reaction/slimeteleportation/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/obj/item/slimepotion/clothing/teleportation/T = new T.forceMove(get_turf(holder.my_atom)) @@ -616,6 +665,7 @@ required_other = 1 /datum/chemical_reaction/slimecrystal/on_reaction(datum/reagents/holder, created_volume) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) if(holder.my_atom) var/obj/item/stack/ore/bluespace_crystal/BC = new(get_turf(holder.my_atom)) BC.visible_message("The [BC.name] appears out of thin air!") @@ -631,6 +681,7 @@ required_other = 1 /datum/chemical_reaction/slimepsteroid2/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/obj/item/slimepotion/enhancer/P = new P.forceMove(get_turf(holder.my_atom)) @@ -646,6 +697,7 @@ required_other = 1 /datum/chemical_reaction/slime_territory/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/obj/item/areaeditor/blueprints/slime/P = new P.forceMove(get_turf(holder.my_atom)) @@ -660,6 +712,7 @@ required_other = 1 /datum/chemical_reaction/slimestop/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/mob/mob = get_mob_by_key(holder.my_atom.fingerprintslast) var/obj/effect/timestop/T = new T.forceMove(get_turf(holder.my_atom)) @@ -676,6 +729,7 @@ required_other = 1 /datum/chemical_reaction/slimepotionlaser/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/obj/item/slimepotion/clothing/laserresistance/L = new L.forceMove(get_turf(holder.my_atom)) @@ -689,6 +743,7 @@ required_other = 1 /datum/chemical_reaction/slimecamera/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/obj/item/camera/P = new P.forceMove(get_turf(holder.my_atom)) var/obj/item/camera_film/Z = new @@ -704,6 +759,7 @@ required_other = 1 /datum/chemical_reaction/slimefloor/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) new /obj/item/stack/tile/sepia(get_turf(holder.my_atom), 25) @@ -720,6 +776,7 @@ required_other = 1 /datum/chemical_reaction/slimepaint/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/list/paints = subtypesof(/obj/item/reagent_containers/glass/paint) var/chosen = pick(paints) var/obj/P = new chosen @@ -736,6 +793,7 @@ required_other = 1 /datum/chemical_reaction/slimepotionrad/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/obj/item/slimepotion/clothing/radiation/R = new R.forceMove(get_turf(holder.my_atom)) @@ -750,6 +808,7 @@ required_container = /obj/item/slime_extract/rainbow /datum/chemical_reaction/slimeRNG/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/mob/living/simple_animal/slime/random/S = new (get_turf(holder.my_atom)) S.visible_message("Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!") @@ -763,5 +822,6 @@ required_container = /obj/item/slime_extract/rainbow /datum/chemical_reaction/slime_transfer/on_reaction(datum/reagents/holder) + SSblackbox.record_feedback("tally", "slime_cores_used", 1, type) var/obj/item/slimepotion/transference/P = new P.forceMove(get_turf(holder.my_atom)) diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index 00e8115f3b2..9cc2a08c205 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -137,6 +137,7 @@ research holder datum. // after that it'll bump it up by 1 until it's greater // than the source tech KT.level = max((KT.level + 1), level) + SSblackbox.log_research(KT.name, KT.level) return KT.level return null diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm index c2e99f3d4f3..41af2f9eee2 100644 --- a/code/modules/security_levels/keycard_authentication.dm +++ b/code/modules/security_levels/keycard_authentication.dm @@ -204,6 +204,7 @@ GLOB.ert_request_answered = FALSE ERT_Announce(ert_reason , event_triggered_by, 0) ert_reason = null + SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("ert", "called")) else var/list/excludemodes = list(/datum/game_mode/nuclear, /datum/game_mode/blob) if(SSticker.mode.type in excludemodes) @@ -236,6 +237,7 @@ GLOBAL_VAR_INIT(station_all_access, 0) D.update_icon() GLOB.minor_announcement.Announce("Ограничения на доступ к техническим и внешним шл+юзам были сняты.") GLOB.maint_all_access = 1 + SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("emergency maintenance access", "enabled")) /proc/revoke_maint_all_access() for(var/area/maintenance/A in GLOB.areas) @@ -244,6 +246,7 @@ GLOBAL_VAR_INIT(station_all_access, 0) D.update_icon() GLOB.minor_announcement.Announce("Ограничения на доступ к техническим и внешним шл+юзам были возобновлены.") GLOB.maint_all_access = 0 + SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("emergency maintenance access", "disabled")) /proc/make_station_all_access() for(var/obj/machinery/door/airlock/D in GLOB.airlocks) @@ -252,6 +255,7 @@ GLOBAL_VAR_INIT(station_all_access, 0) D.update_icon() GLOB.minor_announcement.Announce("Ограничения на доступ ко всем шл+юзам станции были сняты в связи с происходящим кризисом. Статьи о незаконном проникновении по-прежнему действуют, если командование не заявит об обратном.") GLOB.station_all_access = 1 + SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("emergency station access", "enabled")) /proc/revoke_station_all_access() for(var/obj/machinery/door/airlock/D in GLOB.airlocks) @@ -260,3 +264,4 @@ GLOBAL_VAR_INIT(station_all_access, 0) D.update_icon() GLOB.minor_announcement.Announce("Ограничения на доступ ко всем шл+юзам станции были вновь возобновлены. Если вы застряли, обратитесь за помощью к ИИ станции, или к коллегам.") GLOB.station_all_access = 0 + SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("emergency station access", "disabled")) diff --git a/code/modules/security_levels/security_levels.dm b/code/modules/security_levels/security_levels.dm index 77c04a52d92..1a24425f713 100644 --- a/code/modules/security_levels/security_levels.dm +++ b/code/modules/security_levels/security_levels.dm @@ -78,6 +78,7 @@ GLOBAL_DATUM_INIT(security_announcement_down, /datum/announcement/priority/secur SEND_SOUND(M, sound('sound/effects/powerloss.ogg')) set_stationwide_emergency_lighting() addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(epsilon_process)), 15 SECONDS) + SSblackbox.record_feedback("tally", "security_level_changes", 1, level) return if(SEC_LEVEL_DELTA) @@ -87,9 +88,11 @@ GLOBAL_DATUM_INIT(security_announcement_down, /datum/announcement/priority/secur post_status(STATUS_DISPLAY_ALERT, "deltaalert") set_stationwide_emergency_lighting() update_station_firealarms() + SSblackbox.record_feedback("tally", "security_level_changes", 1, level) return SSnightshift.check_nightshift(TRUE) + SSblackbox.record_feedback("tally", "security_level_changes", 1, level) if(GLOB.sibsys_automode && !isnull(GLOB.sybsis_registry)) for(var/obj/item/sibyl_system_mod/mod as anything in GLOB.sybsis_registry) diff --git a/code/modules/spacepods/construction.dm b/code/modules/spacepods/construction.dm index b25c9f5c58f..168be4b0401 100644 --- a/code/modules/spacepods/construction.dm +++ b/code/modules/spacepods/construction.dm @@ -225,3 +225,8 @@ ) // EOF ) + +/datum/construction/reversible2/pod/spawn_result(mob/user as mob) + ..() + SSblackbox.record_feedback("amount", "spacepod_created", 1) + return diff --git a/code/modules/vote/vote_verb.dm b/code/modules/vote/vote_verb.dm index c7cccacc9f0..e31a26631ee 100644 --- a/code/modules/vote/vote_verb.dm +++ b/code/modules/vote/vote_verb.dm @@ -61,6 +61,7 @@ V.show_counts = (c2 == "Yes") V.vote_result_type = c3 SSvote.start_vote(V) + SSblackbox.record_feedback("tally", "admin_verb", 1, "Start Vote") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! /datum/admins/proc/togglevotedead() set category = "Admin.Toggles" @@ -80,3 +81,4 @@ else to_chat(world, "Dead Vote has been enabled!") log_and_message_admins("toggled Dead Vote.") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Toggle Dead Vote") //If you are copy-pasting this, ensure the 4th parameter is unique to the new proc! diff --git a/config/example/dbconfig.txt b/config/example/dbconfig.txt index 58481d24bcc..331aabd8fe8 100644 --- a/config/example/dbconfig.txt +++ b/config/example/dbconfig.txt @@ -9,7 +9,7 @@ ## This value must be set to the version of the paradise schema in use. ## If this value does not match, the SQL database will not be loaded and an error will be generated. ## Roundstart will be delayed. -DB_VERSION 35 +DB_VERSION 34 ## Server the MySQL database can be found at. # Examples: localhost, 200.135.5.43, www.mysqldb.com, etc. diff --git a/paradise.dme b/paradise.dme index 90eca2b5c58..e7da0149b60 100644 --- a/paradise.dme +++ b/paradise.dme @@ -370,6 +370,7 @@ #include "code\controllers\subsystem\non-firing\alarm.dm" #include "code\controllers\subsystem\non-firing\assets.dm" #include "code\controllers\subsystem\non-firing\atoms.dm" +#include "code\controllers\subsystem\non-firing\blackbox.dm" #include "code\controllers\subsystem\non-firing\cargo_quests.dm" #include "code\controllers\subsystem\non-firing\discord.dm" #include "code\controllers\subsystem\non-firing\holiday.dm" diff --git a/tools/ci/dbconfig.txt b/tools/ci/dbconfig.txt index b1b612b3be9..bd41d0a31d6 100644 --- a/tools/ci/dbconfig.txt +++ b/tools/ci/dbconfig.txt @@ -2,7 +2,7 @@ # Dont use it ingame # Remember to update this when you increase the SQL version! -aa SQL_ENABLED -DB_VERSION 35 +DB_VERSION 34 ADDRESS 127.0.0.1 PORT 3306 FEEDBACK_DATABASE feedback