" // 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