diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index 17f4d2389c8..9d52a478f62 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -837,9 +837,9 @@
///from monkey CtrlClickOn(): (/mob)
#define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl"
-///SSalarm signals
-#define COMSIG_TRIGGERED_ALARM "ssalarm_triggered"
-#define COMSIG_CANCELLED_ALARM "ssalarm_cancelled"
+/// Alarm manager signals
+#define COMSIG_TRIGGERED_ALARM "alarmmanager_triggered"
+#define COMSIG_CANCELLED_ALARM "alarmmanager_cancelled"
// /obj/machinery/door signals
#define COMSIG_DOOR_OPEN "door_open"
diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm
index 0d93a0c3e91..f4cf212e8f9 100644
--- a/code/__DEFINES/preferences.dm
+++ b/code/__DEFINES/preferences.dm
@@ -43,24 +43,25 @@
#define TOGGLES_DEFAULT (PREFTOGGLE_CHAT_OOC|PREFTOGGLE_CHAT_DEAD|PREFTOGGLE_CHAT_GHOSTEARS|PREFTOGGLE_CHAT_GHOSTSIGHT|PREFTOGGLE_CHAT_PRAYER|PREFTOGGLE_CHAT_RADIO|PREFTOGGLE_CHAT_LOOC|PREFTOGGLE_MEMBER_PUBLIC|PREFTOGGLE_DONATOR_PUBLIC|PREFTOGGLE_AMBIENT_OCCLUSION|PREFTOGGLE_CHAT_GHOSTPDA|PREFTOGGLE_NUMPAD_TARGET)
// toggles_2 variables. These MUST be prefixed with PREFTOGGLE_2
-#define PREFTOGGLE_2_RANDOMSLOT 1
-#define PREFTOGGLE_2_FANCYUI 2
-#define PREFTOGGLE_2_ITEMATTACK 4
-#define PREFTOGGLE_2_WINDOWFLASHING 8
-#define PREFTOGGLE_2_ANON 16
-#define PREFTOGGLE_2_AFKWATCH 32
-#define PREFTOGGLE_2_RUNECHAT 64
-#define PREFTOGGLE_2_DEATHMESSAGE 128
-#define PREFTOGGLE_2_EMOTE_BUBBLE 256
+#define PREFTOGGLE_2_RANDOMSLOT (1<<0) // 1
+#define PREFTOGGLE_2_FANCYUI (1<<1) // 2
+#define PREFTOGGLE_2_ITEMATTACK (1<<2) // 4
+#define PREFTOGGLE_2_WINDOWFLASHING (1<<3) // 8
+#define PREFTOGGLE_2_ANON (1<<4) // 16
+#define PREFTOGGLE_2_AFKWATCH (1<<5) // 32
+#define PREFTOGGLE_2_RUNECHAT (1<<6) // 64
+#define PREFTOGGLE_2_DEATHMESSAGE (1<<7) // 128
+#define PREFTOGGLE_2_EMOTE_BUBBLE (1<<8) // 256
// Yes I know this being an "enable to disable" is misleading, but it avoids having to tweak all existing pref entries
-#define PREFTOGGLE_2_REVERB_DISABLE 512
-#define PREFTOGGLE_2_FORCE_WHITE_RUNECHAT 1024
-#define PREFTOGGLE_2_SIMPLE_STAT_PANEL 2048
-#define PREFTOGGLE_2_SEE_ITEM_OUTLINES 4096
-#define PREFTOGGLE_2_HIDE_ITEM_TOOLTIPS 8192
-#define PREFTOGGLE_2_THOUGHT_BUBBLE 16384
+#define PREFTOGGLE_2_REVERB_DISABLE (1<<9) // 512
+#define PREFTOGGLE_2_FORCE_WHITE_RUNECHAT (1<<10) // 1024
+#define PREFTOGGLE_2_SIMPLE_STAT_PANEL (1<<11) // 2048
+#define PREFTOGGLE_2_SEE_ITEM_OUTLINES (1<<12) // 4096
+#define PREFTOGGLE_2_HIDE_ITEM_TOOLTIPS (1<<13) // 8192
+#define PREFTOGGLE_2_THOUGHT_BUBBLE (1<<14) // 16384
+#define PREFTOGGLE_2_MC_TABS (1<<15) // 32768
-#define TOGGLES_2_TOTAL 32767 // If you add or remove a preference toggle above, make sure you update this define with the total value of the toggles combined.
+#define TOGGLES_2_TOTAL 65535 // If you add or remove a preference toggle above, make sure you update this define with the total value of the toggles combined.
#define TOGGLES_2_DEFAULT (PREFTOGGLE_2_FANCYUI|PREFTOGGLE_2_ITEMATTACK|PREFTOGGLE_2_WINDOWFLASHING|PREFTOGGLE_2_RUNECHAT|PREFTOGGLE_2_DEATHMESSAGE|PREFTOGGLE_2_EMOTE_BUBBLE|PREFTOGGLE_2_SEE_ITEM_OUTLINES|PREFTOGGLE_2_THOUGHT_BUBBLE)
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index 301bc84223d..99d95963c60 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -58,35 +58,28 @@
#define INIT_ORDER_INPUT 17
#define INIT_ORDER_SOUNDS 16
#define INIT_ORDER_INSTRUMENTS 15
-#define INIT_ORDER_RESEARCH 14
+#define INIT_ORDER_RESEARCH 14 // SoonTM
#define INIT_ORDER_EVENTS 13
#define INIT_ORDER_JOBS 12
-#define INIT_ORDER_TRAITS 11
#define INIT_ORDER_TICKER 10
#define INIT_ORDER_MAPPING 9
-#define INIT_ORDER_NETWORKS 8
#define INIT_ORDER_ATOMS 7
-#define INIT_ORDER_LANGUAGE 6
#define INIT_ORDER_MACHINES 5
-#define INIT_ORDER_CIRCUIT 4
-#define INIT_ORDER_HOLIDAY 3
-#define INIT_ORDER_ALARMS 2
+#define INIT_ORDER_HOLIDAY 4
+#define INIT_ORDER_IDLENPCS 3
+#define INIT_ORDER_MOBS 2
#define INIT_ORDER_TIMER 1
#define INIT_ORDER_DEFAULT 0
#define INIT_ORDER_AIR -1
#define INIT_ORDER_SUN -2
-#define INIT_ORDER_MINIMAP -3
#define INIT_ORDER_ASSETS -4
#define INIT_ORDER_ICON_SMOOTHING -5
#define INIT_ORDER_OVERLAY -6
#define INIT_ORDER_ECONOMY -7
-#define INIT_ORDER_XKEYSCORE -10
-#define INIT_ORDER_STICKY_BAN -10
#define INIT_ORDER_TICKETS -10
#define INIT_ORDER_LIGHTING -20
#define INIT_ORDER_SHUTTLE -21
#define INIT_ORDER_NIGHTSHIFT -22
-#define INIT_ORDER_NANOMOB -23
#define INIT_ORDER_LATE_MAPPING -40
#define INIT_ORDER_PATH -50
#define INIT_ORDER_PERSISTENCE -95
@@ -99,10 +92,9 @@
#define FIRE_PRIORITY_IDLE_NPC 10
#define FIRE_PRIORITY_CLEANUP 10
#define FIRE_PRIORITY_TICKETS 10
-#define FIRE_PRIORITY_RESEARCH 10
+#define FIRE_PRIORITY_RESEARCH 10 // SoonTM
#define FIRE_PRIORITY_AMBIENCE 10
#define FIRE_PRIORITY_GARBAGE 15
-#define FIRE_PRIORITY_WET_FLOORS 20
#define FIRE_PRIORITY_AIR 20
#define FIRE_PRIORITY_NPC 20
#define FIRE_PRIORITY_PROCESS 25
@@ -110,15 +102,11 @@
#define FIRE_PRIORITY_SPACEDRIFT 30
#define FIRE_PRIORITY_FIELDS 30
#define FIRE_PRIORITY_SMOOTHING 35
-#define FIRE_PRIORITY_ORBIT 35
-#define FIRE_PRIORITY_NETWORKS 40
#define FIRE_PRIORITY_OBJ 40
#define FIRE_PRIORITY_ACID 40
#define FIRE_PRIORITY_BURNING 40
-#define FIRE_PRIORITY_INBOUNDS 40
#define FIRE_PRIORITY_DEFAULT 50
#define FIRE_PRIORITY_PARALLAX 65
-#define FIRE_PRIORITY_FLIGHTPACKS 80
#define FIRE_PRIORITY_MOBS 100
#define FIRE_PRIORITY_TGUI 110
#define FIRE_PRIORITY_TICKER 200
@@ -156,3 +144,8 @@
}\
A.flags_2 &= ~OVERLAY_QUEUED_2;\
} while (FALSE)
+
+// SS CPU display category flags
+#define SS_CPUDISPLAY_LOW 1
+#define SS_CPUDISPLAY_DEFAULT 2
+#define SS_CPUDISPLAY_HIGH 3
diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm
index f9c6e63c068..f8fdcbd7392 100644
--- a/code/_onclick/ai.dm
+++ b/code/_onclick/ai.dm
@@ -44,7 +44,7 @@
add_attack_logs(src, src, "[key_name_admin(src)] might be running a modified client! (failed can_see on AI click of [A]([ADMIN_COORDJMP(pixel_turf)]))", ATKLOG_ALL)
var/message = "[key_name(src)] might be running a modified client! (failed can_see on AI click of [A]([COORD(pixel_turf)]))"
log_admin(message)
- SSdiscord.send2discord_simple_noadmins("**\[Warning]** [key_name(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)]))")
+ GLOB.discord_manager.send2discord_simple_noadmins("**\[Warning]** [key_name(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)]))")
var/turf_visible
@@ -57,7 +57,7 @@
if(pixel_turf.obscured)
log_admin("[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)])")
add_attack_logs(src, src, "[key_name_admin(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([ADMIN_COORDJMP(pixel_turf)]))", ATKLOG_ALL)
- SSdiscord.send2discord_simple_noadmins("**\[Warning]** [key_name(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)]))")
+ GLOB.discord_manager.send2discord_simple_noadmins("**\[Warning]** [key_name(src)] might be running a modified client! (failed checkTurfVis on AI click of [A]([COORD(pixel_turf)]))")
return
var/list/modifiers = params2list(params)
diff --git a/code/controllers/configuration/sections/system_configuration.dm b/code/controllers/configuration/sections/system_configuration.dm
index 52686f8131a..fd3f0b30811 100644
--- a/code/controllers/configuration/sections/system_configuration.dm
+++ b/code/controllers/configuration/sections/system_configuration.dm
@@ -4,10 +4,6 @@
protection_state = PROTECTION_PRIVATE
/// Password for authorising world/Topic requests
var/topic_key = null
- /// Medal hub address for lavaland stats
- var/medal_hub_address = null
- /// Medal hub password for lavaland stats
- var/medal_hub_password = null
/// Do we want the server to kill on reboot instead of keeping the same DD session
var/shutdown_on_reboot = FALSE
/// Is this server a production server (Has higher security and requires 2FA)
@@ -41,8 +37,6 @@
CONFIG_LOAD_BOOL(enable_multi_instance_support, data["enable_multi_instance_support"])
CONFIG_LOAD_STR(topic_key, data["communications_password"])
- CONFIG_LOAD_STR(medal_hub_address, data["medal_hub_address"])
- CONFIG_LOAD_STR(medal_hub_password, data["medal_hub_password"])
CONFIG_LOAD_STR(shutdown_shell_command, data["shutdown_shell_command"])
CONFIG_LOAD_STR(api_host, data["api_host"])
CONFIG_LOAD_STR(api_key, data["api_key"])
diff --git a/code/controllers/master.dm b/code/controllers/master.dm
index c83bb6d5dc3..14c71a72a3f 100644
--- a/code/controllers/master.dm
+++ b/code/controllers/master.dm
@@ -19,7 +19,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
name = "Master"
/// Are we processing (higher values increase the processing delay by n ticks)
- var/processing = TRUE
+ var/processing = 1
/// How many times have we ran
var/iteration = 0
@@ -210,7 +210,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
if(init_sss)
init_subtypes(/datum/controller/subsystem, subsystems)
- to_chat(world, "Initializing subsystems...")
+ log_startup_progress("Initializing subsystems...")
// Sort subsystems by init_order, so they initialize in the correct order.
sortTim(subsystems, /proc/cmp_subsystem_init)
@@ -221,8 +221,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
for(var/datum/controller/subsystem/SS in subsystems)
if(SS.flags & SS_NO_INIT)
continue
- SS.log_startup_progress("Initializing...")
- SS.Initialize(REALTIMEOFDAY)
+ SS.call_init(REALTIMEOFDAY)
CHECK_TICK
current_ticklimit = TICK_LIMIT_RUNNING
var/time = (REALTIMEOFDAY - start_timeofday) / 10
diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm
index 6b8e76395ad..e2c305a6802 100644
--- a/code/controllers/subsystem.dm
+++ b/code/controllers/subsystem.dm
@@ -19,6 +19,9 @@
/// What are the implications of this SS being offlined?
var/offline_implications = "None. No immediate action is needed."
+ /// Tab to display in under the MC subtabs
+ var/cpu_display = SS_CPUDISPLAY_DEFAULT
+
/// Order of initialization. Higher numbers are initialized first, lower numbers later. Use or create defines such as [INIT_ORDER_DEFAULT] so we can see the order in one file.
var/init_order = INIT_ORDER_DEFAULT
@@ -91,6 +94,9 @@
/// Priority at the time the subsystem entered the queue. Needed to avoid changes in priority (by admins and the like) from breaking things.
var/queued_priority
+ /// Amount of times the subsystem has slept during fire()
+ var/fire_sleep_count = 0
+
/// How many times we suspect a subsystem type has crashed the MC, 3 strikes and you're out!
var/static/list/failure_strikes
@@ -125,8 +131,10 @@
fire(resumed)
. = state
if(state == SS_SLEEPING)
+ fire_sleep_count++
state = SS_IDLE
if(state == SS_PAUSING)
+ fire_sleep_count++
var/QT = queued_time
enqueue()
state = SS_PAUSED
@@ -260,11 +268,16 @@
return
//used to initialize the subsystem AFTER the map has loaded
-/datum/controller/subsystem/Initialize(start_timeofday)
+/datum/controller/subsystem/proc/call_init(start_timeofday)
+ SHOULD_NOT_OVERRIDE(TRUE)
+ log_startup_progress("Initializing...")
+ Initialize()
initialized = TRUE
var/time = (REALTIMEOFDAY - start_timeofday) / 10
log_startup_progress("Initialized within [time] second[time == 1 ? "" : "s"]!")
- return time
+
+/datum/controller/subsystem/Initialize()
+ CRASH("Initialize() not overriden for [type]! Make the subsystem Initialize or add SS_NO_INIT to the flags")
//hook for printing stats to the "MC" statuspanel for admins to see performance and related stats etc.
/datum/controller/subsystem/stat_entry(msg)
@@ -297,7 +310,7 @@
if(SS_SLEEPING)
. = "S"
if(SS_IDLE)
- . = " "
+ . = " "
/datum/controller/subsystem/proc/state_colour()
switch(state)
@@ -342,5 +355,6 @@
var/list/out = list()
out["cost"] = cost
out["tick_usage"] = tick_usage
+ out["sleep_count"] = fire_sleep_count
out["custom"] = list() // Override as needed on child
return out
diff --git a/code/controllers/subsystem/acid.dm b/code/controllers/subsystem/acid.dm
index f6933f10e8c..befc1ebfc62 100644
--- a/code/controllers/subsystem/acid.dm
+++ b/code/controllers/subsystem/acid.dm
@@ -3,6 +3,7 @@ SUBSYSTEM_DEF(acid)
priority = FIRE_PRIORITY_ACID
flags = SS_NO_INIT|SS_BACKGROUND
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+ cpu_display = SS_CPUDISPLAY_LOW
offline_implications = "Objects will no longer react to acid. No immediate action is needed."
var/list/currentrun = list()
diff --git a/code/controllers/subsystem/afk.dm b/code/controllers/subsystem/afk.dm
index c9cf44a48d2..95657aeae2d 100644
--- a/code/controllers/subsystem/afk.dm
+++ b/code/controllers/subsystem/afk.dm
@@ -6,18 +6,17 @@ SUBSYSTEM_DEF(afk)
name = "AFK Watcher"
wait = 300
flags = SS_BACKGROUND
+ cpu_display = SS_CPUDISPLAY_LOW
offline_implications = "Players will no longer be marked as AFK. No immediate action is needed."
var/list/afk_players = list() // Associative list. ckey as key and AFK state as value
var/list/non_cryo_antags
/datum/controller/subsystem/afk/Initialize()
-
if(GLOB.configuration.afk.warning_minutes <= 0 || GLOB.configuration.afk.auto_cryo_minutes <= 0 || GLOB.configuration.afk.auto_despawn_minutes <= 0)
flags |= SS_NO_FIRE
else
non_cryo_antags = list(SPECIAL_ROLE_ABDUCTOR_AGENT, SPECIAL_ROLE_ABDUCTOR_SCIENTIST, SPECIAL_ROLE_WIZARD, SPECIAL_ROLE_WIZARD_APPRENTICE, SPECIAL_ROLE_NUKEOPS)
- return ..()
/datum/controller/subsystem/afk/fire()
var/list/toRemove = list()
diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm
index 66e6627c282..abd2bb28ef8 100644
--- a/code/controllers/subsystem/air.dm
+++ b/code/controllers/subsystem/air.dm
@@ -15,6 +15,7 @@ SUBSYSTEM_DEF(air)
flags = SS_BACKGROUND
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
offline_implications = "Turfs will no longer process atmos, and all atmospheric machines (including cryotubes) will no longer function. Shuttle call recommended."
+ cpu_display = SS_CPUDISPLAY_HIGH
var/cost_turfs = 0
var/cost_groups = 0
var/cost_highpressure = 0
@@ -74,7 +75,7 @@ SUBSYSTEM_DEF(air)
cust["hotspots"] = length(hotspots)
.["custom"] = cust
-/datum/controller/subsystem/air/Initialize(timeofday)
+/datum/controller/subsystem/air/Initialize()
setup_overlays() // Assign icons and such for gas-turf-overlays
icon_manager = new() // Sets up icon manager for pipes
if(length(active_turfs))
@@ -84,7 +85,6 @@ SUBSYSTEM_DEF(air)
setup_pipenets(GLOB.machines)
for(var/obj/machinery/atmospherics/A in machinery_to_construct)
A.initialize_atmos_network()
- return ..()
/datum/controller/subsystem/air/fire(resumed = 0)
var/timer = TICK_USAGE_REAL
diff --git a/code/controllers/subsystem/alarm.dm b/code/controllers/subsystem/alarm.dm
deleted file mode 100644
index c9beaf3113b..00000000000
--- a/code/controllers/subsystem/alarm.dm
+++ /dev/null
@@ -1,34 +0,0 @@
-// why is this an SS if it has no fire or init
-// this should be a global datum for piss sake
-// AND YES I KNOW AN SS IS A GLOBAL DATUM, THATS NOT THE POINT
-SUBSYSTEM_DEF(alarm)
- name = "Alarm"
- flags = SS_NO_INIT | SS_NO_FIRE
- var/list/alarms = list("Motion" = list(), "Fire" = list(), "Atmosphere" = list(), "Power" = list(), "Burglar" = list())
-
-/datum/controller/subsystem/alarm/proc/triggerAlarm(class, area/A, list/O, obj/alarmsource)
- var/list/L = alarms[class]
- for(var/I in L)
- if(I == A.name)
- var/list/alarm = L[I]
- var/list/sources = alarm[3]
- if(!(alarmsource.UID() in sources))
- sources += alarmsource.UID()
- return TRUE
- L[A.name] = list(get_area_name(A, TRUE), O, list(alarmsource.UID()))
- SEND_SIGNAL(SSalarm, COMSIG_TRIGGERED_ALARM, class, A, O, alarmsource)
- return TRUE
-
-/datum/controller/subsystem/alarm/proc/cancelAlarm(class, area/A, obj/origin)
- var/list/L = alarms[class]
- var/cleared = FALSE
- for(var/I in L)
- if(I == A.name)
- var/list/alarm = L[I]
- var/list/srcs = alarm[3]
- srcs -= origin.UID()
- if(!length(srcs))
- cleared = TRUE
- L -= I
-
- SEND_SIGNAL(SSalarm, COMSIG_CANCELLED_ALARM, class, A, origin, cleared)
diff --git a/code/controllers/subsystem/ambience.dm b/code/controllers/subsystem/ambience.dm
index 2b1f0894c68..ff43c240899 100644
--- a/code/controllers/subsystem/ambience.dm
+++ b/code/controllers/subsystem/ambience.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(ambience)
priority = FIRE_PRIORITY_AMBIENCE
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
wait = 1 SECONDS
+ cpu_display = SS_CPUDISPLAY_LOW
///Assoc list of listening client - next ambience time
var/list/ambience_listening_clients = list()
diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm
index fe3658b7de1..e3b61eec4b0 100644
--- a/code/controllers/subsystem/blackbox.dm
+++ b/code/controllers/subsystem/blackbox.dm
@@ -2,12 +2,14 @@
SUBSYSTEM_DEF(blackbox)
name = "Blackbox"
- flags = SS_NO_FIRE | SS_NO_INIT
- // Even though we dont initialize, we need this init_order
// On Master.Shutdown(), it shuts down subsystems in the REVERSE order
// The database SS has INIT_ORDER_DBCORE=20, and this SS has INIT_ORDER_BLACKBOX=19
// So putting this ensures it shuts down in the right order
init_order = INIT_ORDER_BLACKBOX
+ wait = 10 MINUTES
+ runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
+ offline_implications = "Player count and admin count statistics will no longer be logged to the database. No immediate action is needed."
+ cpu_display = SS_CPUDISPLAY_LOW
/// List of all recorded feedback
var/list/datum/feedback_variable/feedback = list()
@@ -18,6 +20,26 @@ SUBSYSTEM_DEF(blackbox)
/// Associative list of any feedback variables that have had their format changed since creation and their current version, remember to update this
var/list/versions = list()
+/datum/controller/subsystem/blackbox/Initialize()
+ if(!SSdbcore.IsConnected())
+ flags |= SS_NO_FIRE // Disable firing if SQL is disabled
+
+/datum/controller/subsystem/blackbox/fire(resumed = 0)
+ sql_poll_players()
+
+/datum/controller/subsystem/blackbox/proc/sql_poll_players()
+ var/datum/db_query/statquery = SSdbcore.NewQuery(
+ "INSERT INTO legacy_population (playercount, admincount, time, server_id) VALUES (:playercount, :admincount, NOW(), :server_id)",
+ list(
+ "playercount" = length(GLOB.clients),
+ "admincount" = length(GLOB.admins),
+ "server_id" = GLOB.configuration.system.instance_id
+ )
+ )
+ statquery.warn_execute()
+ qdel(statquery)
+
+
/datum/controller/subsystem/blackbox/Recover()
feedback = SSblackbox.feedback
sealed = SSblackbox.sealed
diff --git a/code/controllers/subsystem/chat_pings.dm b/code/controllers/subsystem/chat_pings.dm
index eda9a006c01..24fb85d0bd8 100644
--- a/code/controllers/subsystem/chat_pings.dm
+++ b/code/controllers/subsystem/chat_pings.dm
@@ -3,6 +3,7 @@ SUBSYSTEM_DEF(chat_pings)
flags = SS_NO_INIT
runlevels = RUNLEVEL_INIT | RUNLEVEL_LOBBY | RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME // ALL OF THEM
wait = 30 SECONDS // Chat pings every 30 seconds
+ cpu_display = SS_CPUDISPLAY_LOW
/// List of all held chat datums
var/list/datum/chatOutput/chat_datums = list() // Do NOT put this in Initialize(). You will cause issues.
diff --git a/code/controllers/subsystem/cleanup.dm b/code/controllers/subsystem/cleanup.dm
index f5962c45547..15945acd593 100644
--- a/code/controllers/subsystem/cleanup.dm
+++ b/code/controllers/subsystem/cleanup.dm
@@ -18,10 +18,11 @@ SUBSYSTEM_DEF(cleanup)
init_order = INIT_ORDER_CLEANUP
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
offline_implications = "Certain global lists will no longer be cleared of nulls, which may result in runtimes. No immediate action is needed."
+ cpu_display = SS_CPUDISPLAY_LOW
/// A list of global lists we want the subsystem to clean.
var/list/lists_to_clean
-/datum/controller/subsystem/cleanup/Initialize(start_timeofday)
+/datum/controller/subsystem/cleanup/Initialize()
// If you want this subsystem to clean out nulls from a specific list, add it here.
lists_to_clean = list(
GLOB.clients = "clients",
@@ -32,7 +33,6 @@ SUBSYSTEM_DEF(cleanup)
GLOB.human_list = "human_list",
GLOB.carbon_list = "carbon_list"
)
- return ..()
/datum/controller/subsystem/cleanup/fire(resumed)
for(var/L in lists_to_clean)
diff --git a/code/controllers/subsystem/dbcore.dm b/code/controllers/subsystem/dbcore.dm
index 369cf48e00d..3ca62a66944 100644
--- a/code/controllers/subsystem/dbcore.dm
+++ b/code/controllers/subsystem/dbcore.dm
@@ -3,6 +3,7 @@ SUBSYSTEM_DEF(dbcore)
flags = SS_BACKGROUND
wait = 1 MINUTES
init_order = INIT_ORDER_DBCORE
+ cpu_display = SS_CPUDISPLAY_LOW
/// Is the DB schema valid
var/schema_valid = TRUE
@@ -30,9 +31,8 @@ SUBSYSTEM_DEF(dbcore)
// This is in Initialize() so that its actually seen in chat
/datum/controller/subsystem/dbcore/Initialize()
if(!schema_valid)
- to_chat(world, "Database schema ([GLOB.configuration.database.version]) doesn't match the latest schema version ([SQL_VERSION]). Roundstart has been delayed.")
+ log_startup_progress("Database schema ([GLOB.configuration.database.version]) doesn't match the latest schema version ([SQL_VERSION]). Roundstart has been delayed.")
- return ..()
/datum/controller/subsystem/dbcore/fire()
for(var/I in active_queries)
diff --git a/code/controllers/subsystem/debugview.dm b/code/controllers/subsystem/debugview.dm
index e0b16344a9b..b9a924b4f51 100644
--- a/code/controllers/subsystem/debugview.dm
+++ b/code/controllers/subsystem/debugview.dm
@@ -3,6 +3,7 @@ SUBSYSTEM_DEF(debugview)
wait = 1 // SS_TICKER subsystem, so wait is in ticks
flags = SS_TICKER|SS_NO_INIT
offline_implications = "Shift+F3 will no longer show a debug view. No immediate action is needed."
+ cpu_display = SS_CPUDISPLAY_LOW
/// List of clients currently processing
var/list/client/processing = list()
diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm
index 1bdf37272cc..2a13deb2c1b 100644
--- a/code/controllers/subsystem/economy.dm
+++ b/code/controllers/subsystem/economy.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(economy)
wait = 30 SECONDS
runlevels = RUNLEVEL_GAME
offline_implications = "Crew wont get their paychecks. No immediate action is needed." // money go down
+ cpu_display = SS_CPUDISPLAY_LOW
///List of all money account databases existing in the round
var/list/money_account_databases = list()
///Total amount of account created during the round, neccesary for generating unique account ids
@@ -133,7 +134,6 @@ SUBSYSTEM_DEF(economy)
centcom_message = "
---[station_time_timestamp()]---
Remember to stamp and send back the supply manifests.
"
next_paycheck_delay = 30 MINUTES + world.time
- return ..()
/datum/controller/subsystem/economy/fire()
if(next_paycheck_delay <= world.time)
diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm
index 06ff25f8455..05cf11c1c08 100644
--- a/code/controllers/subsystem/events.dm
+++ b/code/controllers/subsystem/events.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(events)
runlevels = RUNLEVEL_GAME
flags = SS_KEEP_TIMING
offline_implications = "Random events will no longer happen. No immediate action is needed."
+ cpu_display = SS_CPUDISPLAY_LOW
// Report events at the end of the rouund
var/report_at_round_end = 0
@@ -31,7 +32,6 @@ SUBSYSTEM_DEF(events)
/datum/controller/subsystem/events/Initialize()
allEvents = subtypesof(/datum/event)
- return ..()
/datum/controller/subsystem/events/fire()
for(var/datum/event/E in active_events)
diff --git a/code/controllers/subsystem/fires.dm b/code/controllers/subsystem/fires.dm
index f261158b269..f811713e632 100644
--- a/code/controllers/subsystem/fires.dm
+++ b/code/controllers/subsystem/fires.dm
@@ -3,6 +3,7 @@ SUBSYSTEM_DEF(fires)
priority = FIRE_PRIORITY_BURNING
flags = SS_NO_INIT|SS_BACKGROUND
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+ cpu_display = SS_CPUDISPLAY_LOW // Trust me, this isnt atmos fires, this is paper and stuff being lit with lighters and stuff
offline_implications = "Objects will no longer react to fires. No immediate action is needed."
var/list/currentrun = list()
diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm
index 85f170efd1c..ef4b9587697 100644
--- a/code/controllers/subsystem/garbage.dm
+++ b/code/controllers/subsystem/garbage.dm
@@ -4,8 +4,9 @@ SUBSYSTEM_DEF(garbage)
wait = 2 SECONDS
flags = SS_POST_FIRE_TIMING|SS_BACKGROUND|SS_NO_INIT
runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY
- init_order = INIT_ORDER_GARBAGE // Why does this have an init order if it has SS_NO_INIT?
+ init_order = INIT_ORDER_GARBAGE // AA 2020: Why does this have an init order if it has SS_NO_INIT? | AA 2022: Its used for shutdown
offline_implications = "Garbage collection is no longer functional, and objects will not be qdel'd. Immediate server restart recommended."
+ cpu_display = SS_CPUDISPLAY_HIGH
var/list/collection_timeout = list(2 MINUTES, 10 SECONDS) // deciseconds to wait before moving something up in the queue to the next level
diff --git a/code/controllers/subsystem/ghost_spawns.dm b/code/controllers/subsystem/ghost_spawns.dm
index 4d0c1e97f61..d9fdd669a24 100644
--- a/code/controllers/subsystem/ghost_spawns.dm
+++ b/code/controllers/subsystem/ghost_spawns.dm
@@ -1,10 +1,10 @@
SUBSYSTEM_DEF(ghost_spawns)
name = "Ghost Spawns"
- init_order = INIT_ORDER_EVENTS
- flags = SS_BACKGROUND
+ flags = SS_BACKGROUND | SS_NO_INIT
wait = 1 SECONDS
runlevels = RUNLEVEL_GAME
offline_implications = "Ghosts will no longer be able to respawn as event mobs (Blob, etc..). Shuttle call recommended."
+ cpu_display = SS_CPUDISPLAY_LOW
/// List of polls currently ongoing, to be checked on next fire()
var/list/datum/candidate_poll/currently_polling
diff --git a/code/controllers/subsystem/http.dm b/code/controllers/subsystem/http.dm
index 072edd44645..e740c34ab58 100644
--- a/code/controllers/subsystem/http.dm
+++ b/code/controllers/subsystem/http.dm
@@ -1,10 +1,11 @@
SUBSYSTEM_DEF(http)
name = "HTTP"
- flags = SS_TICKER | SS_BACKGROUND // Measure in ticks, but also only run if we have the spare CPU. We also dont init.
+ flags = SS_TICKER | SS_BACKGROUND // Measure in ticks, but also only run if we have the spare CPU.
wait = 1
runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY // All the time
// Assuming for the worst, since only discord is hooked into this for now, but that may change
offline_implications = "The server is no longer capable of making async HTTP requests. Shuttle call recommended."
+ cpu_display = SS_CPUDISPLAY_LOW
/// List of all async HTTP requests in the processing chain
var/list/datum/http_request/active_async_requests
/// Variable to define if logging is enabled or not. Disabled by default since we know the requests the server is making. Enable with VV if you need to debug requests
@@ -16,9 +17,8 @@ SUBSYSTEM_DEF(http)
. = ..()
rustg_create_async_http_client() // Open the door
-/datum/controller/subsystem/http/Initialize(start_timeofday)
+/datum/controller/subsystem/http/Initialize()
active_async_requests = list()
- return ..()
/datum/controller/subsystem/http/get_stat_details()
return "P: [length(active_async_requests)] | T: [total_requests]"
diff --git a/code/controllers/subsystem/icon_smooth.dm b/code/controllers/subsystem/icon_smooth.dm
index b149112f5f7..5513d9152d8 100644
--- a/code/controllers/subsystem/icon_smooth.dm
+++ b/code/controllers/subsystem/icon_smooth.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(icon_smooth)
priority = FIRE_PRIORITY_SMOOTHING
flags = SS_TICKER
offline_implications = "Objects will no longer smooth together properly. No immediate action is needed."
+ cpu_display = SS_CPUDISPLAY_LOW
var/list/smooth_queue = list()
@@ -40,7 +41,6 @@ SUBSYSTEM_DEF(icon_smooth)
A.smooth_icon()
CHECK_TICK
- return ..()
/datum/controller/subsystem/icon_smooth/proc/add_to_queue(atom/thing)
if(thing.smoothing_flags & SMOOTH_QUEUED)
diff --git a/code/controllers/subsystem/idlenpcpool.dm b/code/controllers/subsystem/idlenpcpool.dm
index bdaed1c2877..b5c52f23ae6 100644
--- a/code/controllers/subsystem/idlenpcpool.dm
+++ b/code/controllers/subsystem/idlenpcpool.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(idlenpcpool)
priority = FIRE_PRIORITY_IDLE_NPC
wait = 60
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+ init_order = INIT_ORDER_IDLENPCS // MUST be after SSmapping since it tracks max Zs
offline_implications = "Idle simple animals will no longer process. Shuttle call recommended."
var/list/currentrun = list()
@@ -12,9 +13,8 @@ SUBSYSTEM_DEF(idlenpcpool)
/datum/controller/subsystem/idlenpcpool/get_stat_details()
return "IdleNPCS:[length(GLOB.simple_animals[AI_IDLE])]|Z:[length(GLOB.simple_animals[AI_Z_OFF])]"
-/datum/controller/subsystem/idlenpcpool/Initialize(start_timeofday)
- idle_mobs_by_zlevel = new /list(world.maxz,0)
- return ..()
+/datum/controller/subsystem/idlenpcpool/Initialize()
+ idle_mobs_by_zlevel = new /list(world.maxz, 0)
/datum/controller/subsystem/idlenpcpool/fire(resumed = FALSE)
if(!resumed)
diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm
index 820b84f2773..4e4e27477fc 100644
--- a/code/controllers/subsystem/input.dm
+++ b/code/controllers/subsystem/input.dm
@@ -10,14 +10,13 @@ SUBSYSTEM_DEF(input)
priority = FIRE_PRIORITY_INPUT
runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY
offline_implications = "Player input will no longer be recognised. Immediate server restart recommended."
+ cpu_display = SS_CPUDISPLAY_HIGH
/// List of clients whose input to process in loop.
var/list/client/processing = list()
/datum/controller/subsystem/input/Initialize()
- initialized = TRUE
refresh_client_macro_sets()
- return ..()
/datum/controller/subsystem/input/get_stat_details()
return "P: [length(processing)]"
diff --git a/code/controllers/subsystem/instancing.dm b/code/controllers/subsystem/instancing.dm
index 6a1185b1e19..51c2532c472 100644
--- a/code/controllers/subsystem/instancing.dm
+++ b/code/controllers/subsystem/instancing.dm
@@ -3,12 +3,13 @@ SUBSYSTEM_DEF(instancing)
runlevels = RUNLEVEL_INIT | RUNLEVEL_LOBBY | RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME
wait = 30 SECONDS
flags = SS_KEEP_TIMING
+ cpu_display = SS_CPUDISPLAY_LOW
// This SS has the default init value since it needs to happen after the DB & redis
/// Associative list of registered commands. K = command name | V = command datum
var/list/datum/server_command/registered_commands = list()
-/datum/controller/subsystem/instancing/Initialize(start_timeofday)
+/datum/controller/subsystem/instancing/Initialize()
// Make sure no one broke things. This check will trip up CI
if(init_order >= SSredis.init_order)
CRASH("SSinstancing was set to init before SSredis. Who broke it?")
@@ -16,7 +17,7 @@ SUBSYSTEM_DEF(instancing)
// Dont even bother if we arent connected to redis or the DB
if(!SSdbcore.IsConnected() || !SSredis.connected || !GLOB.configuration.system.enable_multi_instance_support)
flags |= SS_NO_FIRE
- return ..()
+ return
// Setup our commands
for(var/sct in subtypesof(/datum/server_command))
@@ -36,7 +37,6 @@ SUBSYSTEM_DEF(instancing)
// Announce startup to peers
var/datum/server_command/new_round_announce/NRA = registered_commands["new_round_announce"]
NRA.custom_dispatch(GLOB.configuration.general.server_name, SSmapping.map_datum.fluff_name, SSmapping.map_datum.technical_name)
- return ..()
/datum/controller/subsystem/instancing/fire(resumed)
update_heartbeat()
diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm
index bce263ec795..777f65e2b74 100644
--- a/code/controllers/subsystem/jobs.dm
+++ b/code/controllers/subsystem/jobs.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(jobs)
wait = 5 MINUTES // Dont ever make this a super low value since EXP updates are calculated from this value
runlevels = RUNLEVEL_GAME
offline_implications = "Job playtime hours will no longer be logged. No immediate action is needed."
+ cpu_display = SS_CPUDISPLAY_LOW
//List of all jobs
var/list/occupations = list()
@@ -20,13 +21,12 @@ SUBSYSTEM_DEF(jobs)
///list of station departments and their associated roles and economy payments
var/list/station_departments = list()
-/datum/controller/subsystem/jobs/Initialize(timeofday)
- if(!occupations.len)
+/datum/controller/subsystem/jobs/Initialize()
+ if(!length(occupations))
SetupOccupations()
for(var/department_type in subtypesof(/datum/station_department))
station_departments += new department_type()
LoadJobs(FALSE)
- return ..()
// Only fires every 5 minutes
/datum/controller/subsystem/jobs/fire()
diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm
index 293cb0a36ed..1628f46b396 100644
--- a/code/controllers/subsystem/lighting.dm
+++ b/code/controllers/subsystem/lighting.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(lighting)
init_order = INIT_ORDER_LIGHTING
flags = SS_TICKER
offline_implications = "Lighting will no longer update. Shuttle call recommended."
+ cpu_display = SS_CPUDISPLAY_HIGH
var/static/list/sources_queue = list() // List of lighting sources queued for update.
var/static/list/corners_queue = list() // List of lighting corners queued for update.
var/static/list/objects_queue = list() // List of lighting objects queued for update.
@@ -19,7 +20,7 @@ SUBSYSTEM_DEF(lighting)
cust["objects_queue"] = length(objects_queue)
.["custom"] = cust
-/datum/controller/subsystem/lighting/Initialize(timeofday)
+/datum/controller/subsystem/lighting/Initialize()
if(!initialized)
if(GLOB.configuration.general.starlight)
for(var/I in GLOB.all_areas)
@@ -28,12 +29,9 @@ SUBSYSTEM_DEF(lighting)
A.luminosity = 0
create_all_lighting_objects()
- initialized = TRUE
fire(FALSE, TRUE)
- return ..()
-
/datum/controller/subsystem/lighting/fire(resumed, init_tick_checks)
MC_SPLIT_TICK_INIT(3)
if(!init_tick_checks)
diff --git a/code/controllers/subsystem/machinery.dm b/code/controllers/subsystem/machinery.dm
index 4f2152b3ace..d96865e2e70 100644
--- a/code/controllers/subsystem/machinery.dm
+++ b/code/controllers/subsystem/machinery.dm
@@ -7,6 +7,7 @@ SUBSYSTEM_DEF(machines)
init_order = INIT_ORDER_MACHINES
flags = SS_KEEP_TIMING
offline_implications = "Machinery will no longer process. Shuttle call recommended."
+ cpu_display = SS_CPUDISPLAY_HIGH
var/list/processing = list()
var/list/currentrun = list()
@@ -18,7 +19,6 @@ SUBSYSTEM_DEF(machines)
/datum/controller/subsystem/machines/Initialize()
makepowernets()
fire()
- return ..()
/datum/controller/subsystem/machines/get_metrics()
. = ..()
diff --git a/code/controllers/subsystem/medals.dm b/code/controllers/subsystem/medals.dm
deleted file mode 100644
index 46023427643..00000000000
--- a/code/controllers/subsystem/medals.dm
+++ /dev/null
@@ -1,86 +0,0 @@
-SUBSYSTEM_DEF(medals)
- name = "Medals"
- flags = SS_NO_FIRE
- var/hub_enabled = FALSE
-
-/datum/controller/subsystem/medals/Initialize(timeofday)
- if(GLOB.configuration.system.medal_hub_address && GLOB.configuration.system.medal_hub_password)
- hub_enabled = TRUE
- return ..()
-
-/datum/controller/subsystem/medals/proc/UnlockMedal(medal, client/player)
- set waitfor = FALSE
- if(!medal || !hub_enabled)
- return
- if(isnull(world.SetMedal(medal, player, GLOB.configuration.system.medal_hub_address, GLOB.configuration.system.medal_hub_password)))
- hub_enabled = FALSE
- log_game("MEDAL ERROR: Could not contact hub to award medal [medal] to player [player.ckey].")
- message_admins("Error! Failed to contact hub to award [medal] medal to [player.ckey]!")
- return
- to_chat(player, "Achievement unlocked: [medal]!")
-
-/datum/controller/subsystem/medals/proc/SetScore(score, client/player, increment, force)
- set waitfor = FALSE
- if(!score || !hub_enabled)
- return
-
- var/list/oldscore = GetScore(score, player, TRUE)
- if(increment)
- if(!oldscore[score])
- oldscore[score] = 1
- else
- oldscore[score] = (text2num(oldscore[score]) + 1)
- else
- oldscore[score] = force
-
- var/newscoreparam = list2params(oldscore)
-
- if(isnull(world.SetScores(player.ckey, newscoreparam, GLOB.configuration.system.medal_hub_address, GLOB.configuration.system.medal_hub_password)))
- hub_enabled = FALSE
- log_game("SCORE ERROR: Could not contact hub to set score. Score [score] for player [player.ckey].")
- message_admins("Error! Failed to contact hub to set [score] score for [player.ckey]!")
-
-/datum/controller/subsystem/medals/proc/GetScore(score, client/player, returnlist)
- if(!score || !hub_enabled)
- return
-
- var/scoreget = world.GetScores(player.ckey, score, GLOB.configuration.system.medal_hub_address, GLOB.configuration.system.medal_hub_password)
- if(isnull(scoreget))
- hub_enabled = FALSE
- log_game("SCORE ERROR: Could not contact hub to get score. Score [score] for player [player.ckey].")
- message_admins("Error! Failed to contact hub to get score [score] for [player.ckey]!")
- return
- . = params2list(scoreget)
- if(!returnlist)
- return .[score]
-
-/datum/controller/subsystem/medals/proc/CheckMedal(medal, client/player)
- if(!medal || !hub_enabled)
- return
-
- if(isnull(world.GetMedal(medal, player, GLOB.configuration.system.medal_hub_address, GLOB.configuration.system.medal_hub_password)))
- hub_enabled = FALSE
- log_game("MEDAL ERROR: Could not contact hub to get medal [medal] for player [player.ckey]")
- message_admins("Error! Failed to contact hub to get [medal] medal for [player.ckey]!")
- return
- to_chat(player, "[medal] is unlocked")
-
-/datum/controller/subsystem/medals/proc/LockMedal(medal, client/player)
- if(!player || !medal || !hub_enabled)
- return
- var/result = world.ClearMedal(medal, player, GLOB.configuration.system.medal_hub_address, GLOB.configuration.system.medal_hub_password)
- switch(result)
- if(null)
- hub_enabled = FALSE
- log_game("MEDAL ERROR: Could not contact hub to clear medal [medal] for player [player.ckey].")
- message_admins("Error! Failed to contact hub to clear [medal] medal for [player.ckey]!")
- if(TRUE)
- message_admins("Medal: [medal] removed for [player.ckey]")
- if(FALSE)
- message_admins("Medal: [medal] was not found for [player.ckey]. Unable to clear.")
-
-
-/datum/controller/subsystem/medals/proc/ClearScore(client/player)
- if(isnull(world.SetScores(player.ckey, "", GLOB.configuration.system.medal_hub_address, GLOB.configuration.system.medal_hub_password)))
- log_game("MEDAL ERROR: Could not contact hub to clear scores for [player.ckey].")
- message_admins("Error! Failed to contact hub to clear scores for [player.ckey]!")
diff --git a/code/controllers/subsystem/metrics.dm b/code/controllers/subsystem/metrics.dm
index 181f24cfb08..2c033d3bc24 100644
--- a/code/controllers/subsystem/metrics.dm
+++ b/code/controllers/subsystem/metrics.dm
@@ -4,13 +4,13 @@ SUBSYSTEM_DEF(metrics)
offline_implications = "Server metrics will no longer be ingested into monitoring systems. No immediate action is needed."
runlevels = RUNLEVEL_LOBBY | RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME // ALL THE LEVELS
flags = SS_KEEP_TIMING // This needs to ingest every 30 IRL seconds, not ingame seconds.
+ cpu_display = SS_CPUDISPLAY_LOW
/// The real time of day the server started. Used to calculate time drift
var/world_init_time = 0 // Not set in here. Set in world/New()
-/datum/controller/subsystem/metrics/Initialize(start_timeofday)
+/datum/controller/subsystem/metrics/Initialize()
if(!GLOB.configuration.metrics.enable_metrics)
flags |= SS_NO_FIRE // Disable firing to save CPU
- return ..()
/datum/controller/subsystem/metrics/fire(resumed)
diff --git a/code/controllers/subsystem/mobs.dm b/code/controllers/subsystem/mobs.dm
index 34980e30672..537683f1d60 100644
--- a/code/controllers/subsystem/mobs.dm
+++ b/code/controllers/subsystem/mobs.dm
@@ -3,7 +3,9 @@ SUBSYSTEM_DEF(mobs)
priority = FIRE_PRIORITY_MOBS
flags = SS_KEEP_TIMING
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
+ init_order = INIT_ORDER_MOBS
offline_implications = "Mobs will no longer process. Immediate server restart recommended."
+ cpu_display = SS_CPUDISPLAY_HIGH
var/list/currentrun = list()
var/static/list/clients_by_zlevel[][]
@@ -21,10 +23,9 @@ SUBSYSTEM_DEF(mobs)
/datum/controller/subsystem/mobs/get_stat_details()
return "P:[length(GLOB.mob_living_list)]"
-/datum/controller/subsystem/mobs/Initialize(start_timeofday)
- clients_by_zlevel = new /list(world.maxz,0)
- dead_players_by_zlevel = new /list(world.maxz,0)
- return ..()
+/datum/controller/subsystem/mobs/Initialize()
+ clients_by_zlevel = new /list(world.maxz, 0)
+ dead_players_by_zlevel = new /list(world.maxz, 0)
/datum/controller/subsystem/mobs/fire(resumed = 0)
var/seconds = wait * 0.1
diff --git a/code/controllers/subsystem/nano_mob_hunter.dm b/code/controllers/subsystem/nano_mob_hunter.dm
index f8148880a9e..9e0e1454328 100644
--- a/code/controllers/subsystem/nano_mob_hunter.dm
+++ b/code/controllers/subsystem/nano_mob_hunter.dm
@@ -1,9 +1,9 @@
SUBSYSTEM_DEF(mob_hunt)
name = "Nano-Mob Hunter GO Server"
- init_order = INIT_ORDER_NANOMOB
priority = FIRE_PRIORITY_NANOMOB // Low priority, no need for MC_TICK_CHECK due to extremely low performance impact.
flags = SS_NO_INIT
offline_implications = "Nano-Mob Hunter will no longer spawn mobs. No immediate action is needed."
+ cpu_display = SS_CPUDISPLAY_LOW
var/max_normal_spawns = 15 //change this to adjust the number of normal spawns that can exist at one time. trapped spawns (from traitors) don't count towards this
var/list/normal_spawns = list()
var/max_trap_spawns = 15 //change this to adjust the number of trap spawns that can exist at one time. traps spawned beyond this point clear the oldest traps
diff --git a/code/controllers/subsystem/nightshift.dm b/code/controllers/subsystem/nightshift.dm
index 052daf445d5..446158b9805 100644
--- a/code/controllers/subsystem/nightshift.dm
+++ b/code/controllers/subsystem/nightshift.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(nightshift)
wait = 600
flags = SS_NO_TICK_CHECK
offline_implications = "The game will no longer shift between day and night lighting. No immediate action is needed."
+ cpu_display = SS_CPUDISPLAY_LOW
var/nightshift_active = FALSE
var/nightshift_start_time = 702000 //7:30 PM, station time
@@ -15,10 +16,9 @@ SUBSYSTEM_DEF(nightshift)
/datum/controller/subsystem/nightshift/Initialize()
if(!GLOB.configuration.general.enable_night_shifts)
- can_fire = FALSE
+ flags |= SS_NO_FIRE
if(GLOB.configuration.general.randomise_shift_time)
GLOB.gametime_offset = rand(0, 23) HOURS
- return ..()
/datum/controller/subsystem/nightshift/fire(resumed = FALSE)
if(world.time - SSticker.round_start_time < nightshift_first_check)
diff --git a/code/controllers/subsystem/assets.dm b/code/controllers/subsystem/non_firing/assets.dm
similarity index 87%
rename from code/controllers/subsystem/assets.dm
rename to code/controllers/subsystem/non_firing/assets.dm
index c8f4b6e0a20..d2c9a90217d 100644
--- a/code/controllers/subsystem/assets.dm
+++ b/code/controllers/subsystem/non_firing/assets.dm
@@ -5,7 +5,7 @@ SUBSYSTEM_DEF(assets)
var/list/cache = list()
var/list/preload = list()
-/datum/controller/subsystem/assets/Initialize(timeofday)
+/datum/controller/subsystem/assets/Initialize()
for(var/type in typesof(/datum/asset) - list(/datum/asset, /datum/asset/simple))
var/datum/asset/A = new type()
A.register()
@@ -14,4 +14,3 @@ SUBSYSTEM_DEF(assets)
for(var/client/C in GLOB.clients)
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(getFilesSlow), C, preload, FALSE), 10)
- return ..()
diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/non_firing/atoms.dm
similarity index 97%
rename from code/controllers/subsystem/atoms.dm
rename to code/controllers/subsystem/non_firing/atoms.dm
index 2335f128d1f..85918ee3a61 100644
--- a/code/controllers/subsystem/atoms.dm
+++ b/code/controllers/subsystem/non_firing/atoms.dm
@@ -15,13 +15,10 @@ SUBSYSTEM_DEF(atoms)
var/list/BadInitializeCalls = list()
-/datum/controller/subsystem/atoms/Initialize(timeofday)
+/datum/controller/subsystem/atoms/Initialize()
setupgenetics()
initialized = INITIALIZATION_INNEW_MAPLOAD
InitializeAtoms()
- return ..()
-
-
/datum/controller/subsystem/atoms/proc/InitializeAtoms(list/atoms, noisy = TRUE)
if(initialized == INITIALIZATION_INSSATOMS)
diff --git a/code/controllers/subsystem/changelog.dm b/code/controllers/subsystem/non_firing/changelog.dm
similarity index 99%
rename from code/controllers/subsystem/changelog.dm
rename to code/controllers/subsystem/non_firing/changelog.dm
index 713436a1d82..cfff6afee40 100644
--- a/code/controllers/subsystem/changelog.dm
+++ b/code/controllers/subsystem/non_firing/changelog.dm
@@ -21,13 +21,13 @@ SUBSYSTEM_DEF(changelog)
/datum/controller/subsystem/changelog/Initialize()
// This entire subsystem relies on SQL being here.
if(!SSdbcore.IsConnected())
- return ..()
+ return
var/datum/db_query/latest_cl_date = SSdbcore.NewQuery("SELECT CAST(UNIX_TIMESTAMP(date_merged) AS CHAR) AS ut FROM changelog ORDER BY date_merged DESC LIMIT 1")
if(!latest_cl_date.warn_execute())
qdel(latest_cl_date)
// Abort if we cant do this
- return ..()
+ return
while(latest_cl_date.NextRow())
current_cl_timestamp = latest_cl_date.item[1]
@@ -48,8 +48,6 @@ SUBSYSTEM_DEF(changelog)
for(var/client/C as anything in startup_clients_open)
OpenChangelog(C)
- return ..()
-
/datum/controller/subsystem/changelog/proc/UpdatePlayerChangelogDate(client/C)
if(!ss_ready)
diff --git a/code/controllers/subsystem/holiday.dm b/code/controllers/subsystem/non_firing/holiday.dm
similarity index 85%
rename from code/controllers/subsystem/holiday.dm
rename to code/controllers/subsystem/non_firing/holiday.dm
index e9b254b1269..c85f69062ab 100644
--- a/code/controllers/subsystem/holiday.dm
+++ b/code/controllers/subsystem/non_firing/holiday.dm
@@ -4,9 +4,9 @@ SUBSYSTEM_DEF(holiday)
flags = SS_NO_FIRE
var/list/holidays
-/datum/controller/subsystem/holiday/Initialize(start_timeofday)
+/datum/controller/subsystem/holiday/Initialize()
if(!GLOB.configuration.general.allow_holidays)
- return ..() //Holiday stuff was not enabled in the config!
+ return //Holiday stuff was not enabled in the config!
var/YY = text2num(time2text(world.timeofday, "YY")) // get the current year
var/MM = text2num(time2text(world.timeofday, "MM")) // get the current month
@@ -27,5 +27,3 @@ SUBSYSTEM_DEF(holiday)
if(H.eventChance)
if(prob(H.eventChance))
H.handle_event()
-
- return ..()
diff --git a/code/controllers/subsystem/late_mapping.dm b/code/controllers/subsystem/non_firing/late_mapping.dm
similarity index 89%
rename from code/controllers/subsystem/late_mapping.dm
rename to code/controllers/subsystem/non_firing/late_mapping.dm
index 719ddef2b36..9d48af77cfa 100644
--- a/code/controllers/subsystem/late_mapping.dm
+++ b/code/controllers/subsystem/non_firing/late_mapping.dm
@@ -9,10 +9,9 @@ SUBSYSTEM_DEF(late_mapping)
/// List of all maze generators to process
var/list/obj/effect/mazegen/generator/maze_generators = list()
-/datum/controller/subsystem/late_mapping/Initialize(start_timeofday)
+/datum/controller/subsystem/late_mapping/Initialize()
if(length(maze_generators))
log_startup_progress("Generating mazes...")
for(var/i in maze_generators)
var/obj/effect/mazegen/generator/MG = i
MG.run_generator()
- return ..()
diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/non_firing/mapping.dm
similarity index 99%
rename from code/controllers/subsystem/mapping.dm
rename to code/controllers/subsystem/non_firing/mapping.dm
index dabe5aca469..3d133f77fa3 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/non_firing/mapping.dm
@@ -35,7 +35,7 @@ SUBSYSTEM_DEF(mapping)
var/F = file("data/next_map.txt")
F << next_map.type
-/datum/controller/subsystem/mapping/Initialize(timeofday)
+/datum/controller/subsystem/mapping/Initialize()
// Load all Z level templates
preloadTemplates()
@@ -111,8 +111,6 @@ SUBSYSTEM_DEF(mapping)
else
world.name = station_name()
- return ..()
-
// Do not confuse with seedRuins()
/datum/controller/subsystem/mapping/proc/handleRuins()
// load in extra levels of space ruins
diff --git a/code/controllers/subsystem/maprotate.dm b/code/controllers/subsystem/non_firing/maprotate.dm
similarity index 95%
rename from code/controllers/subsystem/maprotate.dm
rename to code/controllers/subsystem/non_firing/maprotate.dm
index 04851383707..34040c84a92 100644
--- a/code/controllers/subsystem/maprotate.dm
+++ b/code/controllers/subsystem/non_firing/maprotate.dm
@@ -12,9 +12,9 @@ SUBSYSTEM_DEF(maprotate)
. = ..()
-/datum/controller/subsystem/maprotate/Initialize(start_timeofday)
+/datum/controller/subsystem/maprotate/Initialize()
if(!SSdbcore.IsConnected())
- return ..()
+ return
// Make a quick list for number to date lookups
var/list/days = list("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday")
@@ -37,7 +37,7 @@ SUBSYSTEM_DEF(maprotate)
var/datum/db_query/dbq = SSdbcore.NewQuery("SELECT WEEKDAY(NOW()) AS d")
if(!dbq.warn_execute())
log_startup_progress("Somehow, we failed to extract a numerical day from the DB. ?????????????")
- return ..()
+ return
var/day_index = 0
@@ -50,7 +50,7 @@ SUBSYSTEM_DEF(maprotate)
if(!day_index)
log_startup_progress("Somehow, we failed to extract a valid numerical day from the DB. ?????????????")
- return ..()
+ return
// String interpolation is faster than num2text() for some reason
@@ -74,5 +74,3 @@ SUBSYSTEM_DEF(maprotate)
log_startup_progress("There is no special rotation defined for this day")
- return ..()
-
diff --git a/code/controllers/subsystem/pathfinder.dm b/code/controllers/subsystem/non_firing/pathfinder.dm
similarity index 98%
rename from code/controllers/subsystem/pathfinder.dm
rename to code/controllers/subsystem/non_firing/pathfinder.dm
index a7f99a4c13b..22afcbd4616 100644
--- a/code/controllers/subsystem/pathfinder.dm
+++ b/code/controllers/subsystem/non_firing/pathfinder.dm
@@ -8,7 +8,6 @@ SUBSYSTEM_DEF(pathfinder)
/datum/controller/subsystem/pathfinder/Initialize()
space_type_cache = typecacheof(/turf/space)
mobs = new(10)
- return ..()
/datum/flowcache
var/lcount
diff --git a/code/controllers/subsystem/persistent_data.dm b/code/controllers/subsystem/non_firing/persistent_data.dm
similarity index 99%
rename from code/controllers/subsystem/persistent_data.dm
rename to code/controllers/subsystem/non_firing/persistent_data.dm
index 2ac154fd11d..118f4fd032f 100644
--- a/code/controllers/subsystem/persistent_data.dm
+++ b/code/controllers/subsystem/non_firing/persistent_data.dm
@@ -18,7 +18,6 @@ SUBSYSTEM_DEF(persistent_data)
// Load all the data of registered atoms
for(var/atom/A in registered_atoms)
A.persistent_load()
- return ..()
/datum/controller/subsystem/persistent_data/Shutdown()
// Save all the data of registered atoms
diff --git a/code/controllers/subsystem/radio.dm b/code/controllers/subsystem/non_firing/radio.dm
similarity index 94%
rename from code/controllers/subsystem/radio.dm
rename to code/controllers/subsystem/non_firing/radio.dm
index 533588173ba..402fc3375c6 100644
--- a/code/controllers/subsystem/radio.dm
+++ b/code/controllers/subsystem/non_firing/radio.dm
@@ -1,6 +1,6 @@
SUBSYSTEM_DEF(radio)
name = "Radio"
- flags = SS_NO_INIT | SS_NO_FIRE
+ flags = SS_NO_FIRE
var/list/radiochannels = list(
"Common" = PUB_FREQ,
@@ -25,6 +25,10 @@ SUBSYSTEM_DEF(radio)
var/list/DEPT_FREQS = list(AI_FREQ, COMM_FREQ, ENG_FREQ, MED_FREQ, SEC_FREQ, SCI_FREQ, SRV_FREQ, SUP_FREQ, PROC_FREQ)
var/list/datum/radio_frequency/frequencies = list()
+// This is a disgusting hack to stop this tripping CI when this thing needs to FUCKING DIE
+/datum/controller/subsystem/radio/Initialize()
+ return
+
// This is fucking disgusting and needs to die
/datum/controller/subsystem/radio/proc/frequency_span_class(frequency)
// Antags!
diff --git a/code/controllers/subsystem/server_queue.dm b/code/controllers/subsystem/non_firing/server_queue.dm
similarity index 95%
rename from code/controllers/subsystem/server_queue.dm
rename to code/controllers/subsystem/non_firing/server_queue.dm
index 7855c870918..b240a01689f 100644
--- a/code/controllers/subsystem/server_queue.dm
+++ b/code/controllers/subsystem/non_firing/server_queue.dm
@@ -19,7 +19,7 @@ SUBSYSTEM_DEF(queue)
/// Last world.time we let a ckey in. 3 second delay between each letin to avoid a mass bubble
var/last_letin_time = 0
-/datum/controller/subsystem/queue/Initialize(start_timeofday)
+/datum/controller/subsystem/queue/Initialize()
if(fexists(QUEUE_DATA_FILE))
try
var/F = file2text(QUEUE_DATA_FILE)
@@ -30,7 +30,6 @@ SUBSYSTEM_DEF(queue)
catch
stack_trace("Failed to load [QUEUE_DATA_FILE] from disk due to malformed JSON. You may need to setup the queue again.")
- return ..()
/datum/controller/subsystem/queue/Shutdown()
// Save if persistent
diff --git a/code/controllers/subsystem/sounds.dm b/code/controllers/subsystem/non_firing/sounds.dm
similarity index 99%
rename from code/controllers/subsystem/sounds.dm
rename to code/controllers/subsystem/non_firing/sounds.dm
index 33d97fcfe04..2e33fbe0e04 100644
--- a/code/controllers/subsystem/sounds.dm
+++ b/code/controllers/subsystem/non_firing/sounds.dm
@@ -26,7 +26,6 @@ SUBSYSTEM_DEF(sounds)
/datum/controller/subsystem/sounds/Initialize()
setup_available_channels()
- return ..()
/**
* Sets up all available sound channels
diff --git a/code/controllers/subsystem/titlescreen.dm b/code/controllers/subsystem/non_firing/titlescreen.dm
similarity index 98%
rename from code/controllers/subsystem/titlescreen.dm
rename to code/controllers/subsystem/non_firing/titlescreen.dm
index 90ea775885e..0b2a256c073 100644
--- a/code/controllers/subsystem/titlescreen.dm
+++ b/code/controllers/subsystem/non_firing/titlescreen.dm
@@ -32,5 +32,3 @@ SUBSYSTEM_DEF(title)
for(var/turf/simulated/wall/indestructible/splashscreen/splash in world)
splash.icon = icon
-
- return ..()
diff --git a/code/controllers/subsystem/overlays.dm b/code/controllers/subsystem/overlays.dm
index 7f26fdd2f89..dad9c3683cf 100644
--- a/code/controllers/subsystem/overlays.dm
+++ b/code/controllers/subsystem/overlays.dm
@@ -18,10 +18,7 @@ SUBSYSTEM_DEF(overlays)
stats = list()
/datum/controller/subsystem/overlays/Initialize()
- initialized = TRUE
fire(mc_check = FALSE)
- return ..()
-
/datum/controller/subsystem/overlays/get_stat_details()
return "Ov:[length(queue)]"
diff --git a/code/controllers/subsystem/parallax.dm b/code/controllers/subsystem/parallax.dm
index d6f88ee0d5d..ea912440228 100644
--- a/code/controllers/subsystem/parallax.dm
+++ b/code/controllers/subsystem/parallax.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(parallax)
priority = FIRE_PRIORITY_PARALLAX
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
offline_implications = "Space parallax will no longer move around. No immediate action is needed."
+ cpu_display = SS_CPUDISPLAY_HIGH
var/list/currentrun
var/planet_x_offset = 128
var/planet_y_offset = 128
diff --git a/code/controllers/subsystem/processing/instruments.dm b/code/controllers/subsystem/processing/instruments.dm
index 3d571d2a13d..34d6a7657fc 100644
--- a/code/controllers/subsystem/processing/instruments.dm
+++ b/code/controllers/subsystem/processing/instruments.dm
@@ -25,7 +25,6 @@ PROCESSING_SUBSYSTEM_DEF(instruments)
/datum/controller/subsystem/processing/instruments/Initialize()
initialize_instrument_data()
synthesizer_instrument_ids = get_allowed_instrument_ids()
- return ..()
/**
* Initializes all instrument datums
diff --git a/code/controllers/subsystem/processing/projectiles.dm b/code/controllers/subsystem/processing/projectiles.dm
index 1785e055829..679c61083c7 100644
--- a/code/controllers/subsystem/processing/projectiles.dm
+++ b/code/controllers/subsystem/processing/projectiles.dm
@@ -3,6 +3,7 @@ PROCESSING_SUBSYSTEM_DEF(projectiles)
wait = 1
flags = SS_NO_INIT|SS_TICKER
offline_implications = "Projectiles will no longer move. Shuttle call recommended."
+ cpu_display = SS_CPUDISPLAY_HIGH
/// Maximum moves a projectile can make per tick.
var/global_max_tick_moves = 10
diff --git a/code/controllers/subsystem/profiler.dm b/code/controllers/subsystem/profiler.dm
index cf6c31983f4..9b86d7b3244 100644
--- a/code/controllers/subsystem/profiler.dm
+++ b/code/controllers/subsystem/profiler.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(profiler)
runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY
wait = 5 MINUTES
flags = SS_NO_TICK_CHECK
+ cpu_display = SS_CPUDISPLAY_LOW // its usage itself is high but its every 5 mins so
/// Time it took to fetch normal profile data (ms)
var/nfetch_cost = 0
/// Time it took to write the normal file (ms)
@@ -24,7 +25,6 @@ SUBSYSTEM_DEF(profiler)
if(!GLOB.configuration.general.enable_auto_profiler)
StopProfiling() //Stop the early start profiler if we dont want it on in the config
flags |= SS_NO_FIRE
- return ..()
/datum/controller/subsystem/profiler/fire()
DumpFile()
diff --git a/code/controllers/subsystem/radiation.dm b/code/controllers/subsystem/radiation.dm
index 785aa22ef4e..52a71c99cba 100644
--- a/code/controllers/subsystem/radiation.dm
+++ b/code/controllers/subsystem/radiation.dm
@@ -3,6 +3,7 @@ PROCESSING_SUBSYSTEM_DEF(radiation)
flags = SS_BACKGROUND | SS_NO_INIT
wait = 1 SECONDS
offline_implications = "Radiation will no longer function; power generation may not happen. A restart may or may not be required, depending on the situation."
+ cpu_display = SS_CPUDISPLAY_HIGH
var/list/warned_atoms = list()
// Cache radiation levels for each turf so it doesn't need to be done iteratively
// turf_rad_cache is the state in the current loop, and may not be 100% representative
diff --git a/code/controllers/subsystem/redis.dm b/code/controllers/subsystem/redis.dm
index fac92447146..82bd92d8e58 100644
--- a/code/controllers/subsystem/redis.dm
+++ b/code/controllers/subsystem/redis.dm
@@ -11,6 +11,7 @@ SUBSYSTEM_DEF(redis)
/// Message queue (If messages are sent before the SS has init'd)
var/list/datum/redis_message/queue = list()
offline_implications = "The server will no longer be able to send or receive redis messages. Shuttle call recommended (Potential server crash inbound)."
+ cpu_display = SS_CPUDISPLAY_LOW
// SS meta procs
/datum/controller/subsystem/redis/get_stat_details()
@@ -41,7 +42,6 @@ SUBSYSTEM_DEF(redis)
var/amount_registered = length(subbed_channels)
log_startup_progress("Registered [amount_registered] callback[amount_registered == 1 ? "" : "s"].")
- return ..()
/datum/controller/subsystem/redis/fire()
check_messages()
diff --git a/code/controllers/subsystem/runechat.dm b/code/controllers/subsystem/runechat.dm
index 4602b970383..b1dce57c1a2 100644
--- a/code/controllers/subsystem/runechat.dm
+++ b/code/controllers/subsystem/runechat.dm
@@ -27,6 +27,7 @@ SUBSYSTEM_DEF(runechat)
wait = 1
priority = FIRE_PRIORITY_RUNECHAT
offline_implications = "Runechat messages will no longer clear. Shuttle call recommended."
+ cpu_display = SS_CPUDISPLAY_HIGH
/// world.time of the first entry in the bucket list, effectively the 'start time' of the current buckets
var/head_offset = 0
diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm
index af7a637a40f..9f3f8caf4a4 100644
--- a/code/controllers/subsystem/shuttles.dm
+++ b/code/controllers/subsystem/shuttles.dm
@@ -6,6 +6,7 @@ SUBSYSTEM_DEF(shuttle)
flags = SS_KEEP_TIMING|SS_NO_TICK_CHECK
runlevels = RUNLEVEL_SETUP | RUNLEVEL_GAME
offline_implications = "Shuttles will no longer function. Immediate server restart recommended."
+ cpu_display = SS_CPUDISPLAY_LOW
var/list/mobile = list()
var/list/stationary = list()
var/list/transit = list()
@@ -28,7 +29,7 @@ SUBSYSTEM_DEF(shuttle)
/// Default refuel delay
var/refuel_delay = 20 MINUTES
-/datum/controller/subsystem/shuttle/Initialize(start_timeofday)
+/datum/controller/subsystem/shuttle/Initialize()
if(!emergency)
WARNING("No /obj/docking_port/mobile/emergency placed on the map!")
if(!backup_shuttle)
@@ -39,8 +40,6 @@ SUBSYSTEM_DEF(shuttle)
initial_load()
initial_move()
- return ..()
-
/datum/controller/subsystem/shuttle/get_stat_details()
return "M:[length(mobile)] S:[length(stationary)] T:[length(transit)]"
diff --git a/code/controllers/subsystem/spacedrift.dm b/code/controllers/subsystem/spacedrift.dm
index e684ced3d8f..3bc055c5fde 100644
--- a/code/controllers/subsystem/spacedrift.dm
+++ b/code/controllers/subsystem/spacedrift.dm
@@ -5,6 +5,7 @@ SUBSYSTEM_DEF(spacedrift)
flags = SS_NO_INIT|SS_KEEP_TIMING
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
offline_implications = "Mobs will no longer respect a lack of gravity. No immediate action is needed."
+ cpu_display = SS_CPUDISPLAY_LOW
var/list/currentrun = list()
var/list/processing = list()
diff --git a/code/controllers/subsystem/statistics.dm b/code/controllers/subsystem/statistics.dm
deleted file mode 100644
index 01ebaf215f7..00000000000
--- a/code/controllers/subsystem/statistics.dm
+++ /dev/null
@@ -1,29 +0,0 @@
-SUBSYSTEM_DEF(statistics)
- name = "Statistics"
- wait = 6000 // 10 minute delay between fires
- runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME // Only count time actually ingame to avoid logging pre-round dips
- offline_implications = "Player count and admin count statistics will no longer be logged to the database. No immediate action is needed."
-
-
-/datum/controller/subsystem/statistics/Initialize(start_timeofday)
- if(!SSdbcore.IsConnected())
- flags |= SS_NO_FIRE // Disable firing if SQL is disabled
- return ..()
-
-/datum/controller/subsystem/statistics/fire(resumed = 0)
- sql_poll_players()
-
-/datum/controller/subsystem/statistics/proc/sql_poll_players()
- if(!SSdbcore.IsConnected())
- return
- else
- var/datum/db_query/statquery = SSdbcore.NewQuery(
- "INSERT INTO legacy_population (playercount, admincount, time, server_id) VALUES (:playercount, :admincount, NOW(), :server_id)",
- list(
- "playercount" = length(GLOB.clients),
- "admincount" = length(GLOB.admins),
- "server_id" = GLOB.configuration.system.instance_id
- )
- )
- statquery.warn_execute()
- qdel(statquery)
diff --git a/code/controllers/subsystem/sun.dm b/code/controllers/subsystem/sun.dm
index 74b5679893e..f3a550cf3f5 100644
--- a/code/controllers/subsystem/sun.dm
+++ b/code/controllers/subsystem/sun.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(sun)
flags = SS_NO_TICK_CHECK
init_order = INIT_ORDER_SUN
offline_implications = "Solar panels will no longer rotate. No immediate action is needed."
+ cpu_display = SS_CPUDISPLAY_LOW
var/angle
var/dx
var/dy
@@ -11,7 +12,7 @@ SUBSYSTEM_DEF(sun)
var/list/solars = list()
var/solar_gen_rate = 1500
-/datum/controller/subsystem/sun/Initialize(start_timeofday)
+/datum/controller/subsystem/sun/Initialize()
// Lets work out an angle for the "sun" to rotate around the station
angle = rand (0,360) // the station position to the sun is randomised at round start
rate = rand(50,200)/100 // 50% - 200% of standard rotation
@@ -22,8 +23,6 @@ SUBSYSTEM_DEF(sun)
for(var/obj/machinery/power/solar_control/SC in solars)
SC.setup()
- return ..()
-
/datum/controller/subsystem/sun/get_stat_details()
return "P:[length(solars)]"
diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm
index 85808b7085e..c03021df40a 100644
--- a/code/controllers/subsystem/throwing.dm
+++ b/code/controllers/subsystem/throwing.dm
@@ -8,6 +8,7 @@ SUBSYSTEM_DEF(throwing)
flags = SS_NO_INIT|SS_KEEP_TIMING|SS_TICKER
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
offline_implications = "Thrown objects may not react properly. Shuttle call recommended."
+ cpu_display = SS_CPUDISPLAY_LOW
var/list/currentrun
var/list/processing = list()
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index c04e2f3fe44..8a0e888eaed 100644
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -6,6 +6,7 @@ SUBSYSTEM_DEF(ticker)
flags = SS_KEEP_TIMING
runlevels = RUNLEVEL_LOBBY | RUNLEVEL_SETUP | RUNLEVEL_GAME
offline_implications = "The game is no longer aware of when the round ends. Immediate server restart recommended."
+ cpu_display = SS_CPUDISPLAY_LOW
/// Time the game should start, relative to world.time
var/round_start_time = 0
@@ -76,8 +77,6 @@ SUBSYSTEM_DEF(ticker)
'sound/music/title2.ogg',\
'sound/music/title3.ogg',)
- return ..()
-
/datum/controller/subsystem/ticker/fire()
switch(current_state)
@@ -307,7 +306,7 @@ SUBSYSTEM_DEF(ticker)
var/datum/holiday/holiday = SSholiday.holidays[holidayname]
to_chat(world, "[holiday.greet()]
")
- SSdiscord.send2discord_simple_noadmins("**\[Info]** Round has started")
+ GLOB.discord_manager.send2discord_simple_noadmins("**\[Info]** Round has started")
auto_toggle_ooc(FALSE) // Turn it off
time_game_started = world.time
diff --git a/code/controllers/subsystem/tickets/mentor_tickets.dm b/code/controllers/subsystem/tickets/mentor_tickets.dm
index 0f97094fa52..16c0c3781d4 100644
--- a/code/controllers/subsystem/tickets/mentor_tickets.dm
+++ b/code/controllers/subsystem/tickets/mentor_tickets.dm
@@ -21,10 +21,10 @@ GLOBAL_REAL(SSmentor_tickets, /datum/controller/subsystem/tickets/mentor_tickets
db_save_id = "MENTOR"
/datum/controller/subsystem/tickets/mentor_tickets/Initialize()
+ ..()
close_messages = list("- [ticket_name] Closed -",
"Please try to be as descriptive as possible in mentor helps. Mentors do not know the full situation you're in and need more information to give you a helpful response.",
"Your [ticket_name] has now been closed.")
- return ..()
/datum/controller/subsystem/tickets/mentor_tickets/message_staff(msg, prefix_type = NONE, important = FALSE)
message_mentorTicket(msg, important)
diff --git a/code/controllers/subsystem/tickets/tickets.dm b/code/controllers/subsystem/tickets/tickets.dm
index 3dcbc7c8d23..550e76dcbbb 100644
--- a/code/controllers/subsystem/tickets/tickets.dm
+++ b/code/controllers/subsystem/tickets/tickets.dm
@@ -51,11 +51,9 @@ SUBSYSTEM_DEF(tickets)
.["custom"] = cust
/datum/controller/subsystem/tickets/Initialize()
- if(!close_messages)
- close_messages = list("- [ticket_name] Rejected! -",
- "Please try to be calm, clear, and descriptive in admin helps, do not assume the staff member has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.",
- "Your [ticket_name] has now been closed.")
- return ..()
+ close_messages = list("- [ticket_name] Rejected! -",
+ "Please try to be calm, clear, and descriptive in admin helps, do not assume the staff member has seen any related events, and clearly state the names of anybody you are reporting. If you asked a question, please ensure it was clear what you were asking.",
+ "Your [ticket_name] has now been closed.")
/datum/controller/subsystem/tickets/fire()
var/stales = checkStaleness()
diff --git a/code/controllers/subsystem/time_track.dm b/code/controllers/subsystem/time_track.dm
index fce4a0599dd..58cb144080e 100644
--- a/code/controllers/subsystem/time_track.dm
+++ b/code/controllers/subsystem/time_track.dm
@@ -14,6 +14,7 @@ SUBSYSTEM_DEF(time_track)
var/last_tick_realtime = 0
var/last_tick_byond_time = 0
var/last_tick_tickcount = 0
+ cpu_display = SS_CPUDISPLAY_LOW
/datum/controller/subsystem/time_track/fire()
var/current_realtime = REALTIMEOFDAY
diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm
index 8dd37b4f86d..30fbd33b45d 100644
--- a/code/controllers/subsystem/timer.dm
+++ b/code/controllers/subsystem/timer.dm
@@ -23,6 +23,7 @@ SUBSYSTEM_DEF(timer)
flags = SS_TICKER|SS_NO_INIT
offline_implications = "The game will no longer process timers. Immediate server restart recommended."
+ cpu_display = SS_CPUDISPLAY_HIGH
/// Queue used for storing timers that do not fit into the current buckets
var/list/datum/timedevent/second_queue = list()
diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm
index 08e0017656b..2c2160a621a 100644
--- a/code/controllers/subsystem/vote.dm
+++ b/code/controllers/subsystem/vote.dm
@@ -4,6 +4,7 @@ SUBSYSTEM_DEF(vote)
flags = SS_KEEP_TIMING|SS_NO_INIT
runlevels = RUNLEVEL_LOBBY | RUNLEVELS_DEFAULT
offline_implications = "Votes (Endround shuttle) will no longer function. Shuttle call recommended."
+ cpu_display = SS_CPUDISPLAY_LOW
/// Active vote, if any
var/datum/vote/active_vote
diff --git a/code/controllers/subsystem/weather.dm b/code/controllers/subsystem/weather.dm
index dc4f1f4c81a..757776e1016 100644
--- a/code/controllers/subsystem/weather.dm
+++ b/code/controllers/subsystem/weather.dm
@@ -13,6 +13,7 @@ SUBSYSTEM_DEF(weather)
var/list/processing = list()
var/list/eligible_zlevels = list()
var/list/next_hit_by_zlevel = list() //Used by barometers to know when the next storm is coming
+ cpu_display = SS_CPUDISPLAY_LOW
/datum/controller/subsystem/weather/get_metrics()
. = ..()
@@ -41,7 +42,7 @@ SUBSYSTEM_DEF(weather)
addtimer(CALLBACK(src, PROC_REF(make_eligible), z, possible_weather), randTime + initial(W.weather_duration_upper), TIMER_UNIQUE) //Around 5-10 minutes between weathers
next_hit_by_zlevel["[z]"] = world.time + randTime + initial(W.telegraph_duration)
-/datum/controller/subsystem/weather/Initialize(start_timeofday)
+/datum/controller/subsystem/weather/Initialize()
for(var/V in subtypesof(/datum/weather))
var/datum/weather/W = V
var/probability = initial(W.probability)
@@ -52,7 +53,6 @@ SUBSYSTEM_DEF(weather)
for(var/z in levels_by_trait(target_trait))
LAZYINITLIST(eligible_zlevels["[z]"])
eligible_zlevels["[z]"][W] = probability
- return ..()
/datum/controller/subsystem/weather/proc/run_weather(datum/weather/weather_datum_type, z_levels)
if(istext(weather_datum_type))
diff --git a/code/datums/alarm_manager.dm b/code/datums/alarm_manager.dm
new file mode 100644
index 00000000000..8c2dbef0279
--- /dev/null
+++ b/code/datums/alarm_manager.dm
@@ -0,0 +1,37 @@
+GLOBAL_DATUM_INIT(alarm_manager, /datum/alarm_manager, new())
+
+/datum/alarm_manager
+ var/list/alarms = list(
+ "Motion" = list(),
+ "Fire" = list(),
+ "Atmosphere" = list(),
+ "Power" = list(),
+ "Burglar" = list()
+ )
+
+/datum/alarm_manager/proc/trigger_alarm(class, area/A, list/O, obj/alarmsource)
+ var/list/L = alarms[class]
+ for(var/I in L)
+ if(I == A.name)
+ var/list/alarm = L[I]
+ var/list/sources = alarm[3]
+ if(!(alarmsource.UID() in sources))
+ sources += alarmsource.UID()
+ return TRUE
+ L[A.name] = list(get_area_name(A, TRUE), O, list(alarmsource.UID()))
+ SEND_SIGNAL(GLOB.alarm_manager, COMSIG_TRIGGERED_ALARM, class, A, O, alarmsource)
+ return TRUE
+
+/datum/alarm_manager/proc/cancel_alarm(class, area/A, obj/origin)
+ var/list/L = alarms[class]
+ var/cleared = FALSE
+ for(var/I in L)
+ if(I == A.name)
+ var/list/alarm = L[I]
+ var/list/srcs = alarm[3]
+ srcs -= origin.UID()
+ if(!length(srcs))
+ cleared = TRUE
+ L -= I
+
+ SEND_SIGNAL(GLOB.alarm_manager, COMSIG_CANCELLED_ALARM, class, A, origin, cleared)
diff --git a/code/controllers/subsystem/discord.dm b/code/datums/discord/discord_manager.dm
similarity index 83%
rename from code/controllers/subsystem/discord.dm
rename to code/datums/discord/discord_manager.dm
index e6dd4438ffe..ef4aec4ae2b 100644
--- a/code/controllers/subsystem/discord.dm
+++ b/code/datums/discord/discord_manager.dm
@@ -1,21 +1,14 @@
-SUBSYSTEM_DEF(discord)
- name = "Discord"
- flags = SS_NO_FIRE
- /// Is the SS enabled
- var/enabled = FALSE
+GLOBAL_DATUM_INIT(discord_manager, /datum/discord_manager, new())
+
+/datum/discord_manager
/// Last time the administrator ping was dropped. This ensures administrators cannot be mass pinged if a large chunk of ahelps go off at once (IE: tesloose)
var/last_administration_ping = 0
/// Last time the mentor ping was dropped. This ensures mentors cannot be mass pinged if a large chunk of mhelps go off at once.
var/last_mentor_ping = 0
-/datum/controller/subsystem/discord/Initialize(start_timeofday)
- if(GLOB.configuration.discord.webhooks_enabled)
- enabled = TRUE
- return ..()
-
// This is designed for ease of simplicity for sending quick messages from parts of the code
-/datum/controller/subsystem/discord/proc/send2discord_simple(destination, content)
- if(!enabled)
+/datum/discord_manager/proc/send2discord_simple(destination, content)
+ if(!GLOB.configuration.discord.webhooks_enabled)
return
var/list/webhook_urls
switch(destination)
@@ -32,8 +25,8 @@ SUBSYSTEM_DEF(discord)
SShttp.create_async_request(RUSTG_HTTP_METHOD_POST, url, dwp.serialize2json(), list("content-type" = "application/json"))
// This one is designed to take in a [/datum/discord_webhook_payload] which was prepared beforehand
-/datum/controller/subsystem/discord/proc/send2discord_complex(destination, datum/discord_webhook_payload/dwp)
- if(!enabled)
+/datum/discord_manager/proc/send2discord_complex(destination, datum/discord_webhook_payload/dwp)
+ if(!GLOB.configuration.discord.webhooks_enabled)
return
var/list/webhook_urls
switch(destination)
@@ -47,8 +40,8 @@ SUBSYSTEM_DEF(discord)
SShttp.create_async_request(RUSTG_HTTP_METHOD_POST, url, dwp.serialize2json(), list("content-type" = "application/json"))
// This one is for sending messages to the admin channel if no admins are active, complete with a ping to the game admins role
-/datum/controller/subsystem/discord/proc/send2discord_simple_noadmins(content, check_send_always = FALSE)
- if(!enabled)
+/datum/discord_manager/proc/send2discord_simple_noadmins(content, check_send_always = FALSE)
+ if(!GLOB.configuration.discord.webhooks_enabled)
return
// Setup some stuff
var/alerttext
@@ -77,7 +70,7 @@ SUBSYSTEM_DEF(discord)
for(var/url in GLOB.configuration.discord.admin_webhook_urls)
SShttp.create_async_request(RUSTG_HTTP_METHOD_POST, url, dwp.serialize2json(), list("content-type" = "application/json"))
-/datum/controller/subsystem/discord/proc/send2discord_simple_mentor(content)
+/datum/discord_manager/proc/send2discord_simple_mentor(content)
var/alerttext
var/list/mentorcounter = staff_countup(R_MENTOR)
var/active_mentors = mentorcounter[1]
@@ -99,7 +92,7 @@ SUBSYSTEM_DEF(discord)
SShttp.create_async_request(RUSTG_HTTP_METHOD_POST, url, dwp.serialize2json(), list("content-type" = "application/json"))
// Helper to make administrator ping easier
-/datum/controller/subsystem/discord/proc/handle_administrator_ping()
+/datum/discord_manager/proc/handle_administrator_ping()
// Check if a role is even set
if(GLOB.configuration.discord.admin_role_id)
if(last_administration_ping > world.time)
@@ -110,7 +103,7 @@ SUBSYSTEM_DEF(discord)
return ""
-/datum/controller/subsystem/discord/proc/handle_mentor_ping()
+/datum/discord_manager/proc/handle_mentor_ping()
if(GLOB.configuration.discord.mentor_role_id)
if(last_mentor_ping > world.time)
return " *(Role pinged recently)*"
diff --git a/code/datums/discord.dm b/code/datums/discord/discord_webhook.dm
similarity index 100%
rename from code/datums/discord.dm
rename to code/datums/discord/discord_webhook.dm
diff --git a/code/controllers/subsystem/ipintel.dm b/code/datums/ipintel.dm
similarity index 89%
rename from code/controllers/subsystem/ipintel.dm
rename to code/datums/ipintel.dm
index f35c3cc130c..b857c855bb0 100644
--- a/code/controllers/subsystem/ipintel.dm
+++ b/code/datums/ipintel.dm
@@ -1,20 +1,11 @@
-SUBSYSTEM_DEF(ipintel)
- name = "XKeyScore"
- wait = 1
- flags = SS_NO_FIRE
- init_order = INIT_ORDER_XKEYSCORE // 10
- // Are we enabled? Auto disable at world init to avoid checking reconnects
- var/enabled = FALSE
+GLOBAL_DATUM_INIT(ipintel_manager, /datum/ipintel_manager, new())
+
+/datum/ipintel_manager
var/throttle = 0
var/errors = 0
var/list/cache = list()
-/datum/controller/subsystem/ipintel/Initialize(timeofday)
- enabled = TRUE
- return ..()
-
-
// Represents an IP intel holder datum
/datum/ipintel
/// The IP being checked
@@ -57,11 +48,11 @@ SUBSYSTEM_DEF(ipintel)
* * bypasscache - Do we want to bypass the DB cache?
* * updatecache - Do we want to update the DB cache?
*/
-/datum/controller/subsystem/ipintel/proc/get_ip_intel(ip, bypasscache = FALSE, updatecache = TRUE)
+/datum/ipintel_manager/proc/get_ip_intel(ip, bypasscache = FALSE, updatecache = TRUE)
var/datum/ipintel/res = new()
res.ip = ip
. = res
- if(!ip || !GLOB.configuration.ipintel.contact_email || !GLOB.configuration.ipintel.enabled || !enabled)
+ if(!ip || !GLOB.configuration.ipintel.contact_email || !GLOB.configuration.ipintel.enabled)
return
if(!bypasscache)
var/datum/ipintel/cachedintel = cache[ip]
@@ -129,14 +120,12 @@ SUBSYSTEM_DEF(ipintel)
* * ip - The IP to lookup
* * retried - Was this attempt retried?
*/
-/datum/controller/subsystem/ipintel/proc/ip_intel_query(ip, retried = FALSE)
+/datum/ipintel_manager/proc/ip_intel_query(ip, retried = FALSE)
. = -1 //default
if(!ip)
return
if(throttle > world.timeofday)
return
- if(!enabled)
- return
// Do not refactor this to use SShttp, because that requires the subsystem to be firing for requests to be made, and this will be triggered before the MC has finished loading
var/list/http[] = HTTPGet("http://[GLOB.configuration.ipintel.ipintel_domain]/check.php?ip=[ip]&contact=[GLOB.configuration.ipintel.contact_email]&format=json&flags=b")
@@ -188,7 +177,7 @@ SUBSYSTEM_DEF(ipintel)
* * ip - The IP that was tried
* * retried - Was this on a retried attempt
*/
-/datum/controller/subsystem/ipintel/proc/ipintel_handle_error(error, ip, retried)
+/datum/ipintel_manager/proc/ipintel_handle_error(error, ip, retried)
if(retried)
errors++
error += " Could not check [ip]. Disabling IPINTEL for [errors] minute[(errors == 1 ? "" : "s")]"
@@ -207,7 +196,7 @@ SUBSYSTEM_DEF(ipintel)
* Arguments:
* * text - Argument 1
*/
-/datum/controller/subsystem/ipintel/proc/log_ipintel(text)
+/datum/ipintel_manager/proc/log_ipintel(text)
log_game("IPINTEL: [text]")
log_debug("IPINTEL: [text]")
@@ -222,7 +211,7 @@ SUBSYSTEM_DEF(ipintel)
* * t_ckey - The ckey to check
* * t_ip - The IP to check
*/
-/datum/controller/subsystem/ipintel/proc/ipintel_is_banned(t_ckey, t_ip)
+/datum/ipintel_manager/proc/ipintel_is_banned(t_ckey, t_ip)
if(!GLOB.configuration.ipintel.contact_email)
return FALSE
if(!GLOB.configuration.ipintel.enabled)
@@ -247,7 +236,7 @@ SUBSYSTEM_DEF(ipintel)
* Arguments:
* * target_ip - The IP to check
*/
-/datum/controller/subsystem/ipintel/proc/ipintel_badip_check(target_ip)
+/datum/ipintel_manager/proc/ipintel_badip_check(target_ip)
var/rating_bad = GLOB.configuration.ipintel.bad_rating
if(!rating_bad)
log_debug("ipintel_badip_check reports misconfigured rating_bad directive")
@@ -285,7 +274,7 @@ SUBSYSTEM_DEF(ipintel)
* Arguments:
* * target_ckey - The ckey to check
*/
-/datum/controller/subsystem/ipintel/proc/vpn_whitelist_check(target_ckey)
+/datum/ipintel_manager/proc/vpn_whitelist_check(target_ckey)
if(!GLOB.configuration.ipintel.whitelist_mode)
return FALSE
var/datum/db_query/query_whitelist_check = SSdbcore.NewQuery("SELECT * FROM vpn_whitelist WHERE ckey=:ckey", list(
@@ -310,7 +299,7 @@ SUBSYSTEM_DEF(ipintel)
* Arguments:
* * target_ckey - The ckey to whitelist
*/
-/datum/controller/subsystem/ipintel/proc/vpn_whitelist_add(target_ckey)
+/datum/ipintel_manager/proc/vpn_whitelist_add(target_ckey)
var/reason_string = input(usr, "Enter link to the URL of their whitelist request on the forum.","Reason required") as message|null
if(!reason_string)
return FALSE
@@ -334,7 +323,7 @@ SUBSYSTEM_DEF(ipintel)
* Arguments:
* * target_ckey - The ckey to remove
*/
-/datum/controller/subsystem/ipintel/proc/vpn_whitelist_remove(target_ckey)
+/datum/ipintel_manager/proc/vpn_whitelist_remove(target_ckey)
var/datum/db_query/query_whitelist_remove = SSdbcore.NewQuery("DELETE FROM vpn_whitelist WHERE ckey=:targetckey", list(
"targetckey" = target_ckey
))
@@ -354,7 +343,7 @@ SUBSYSTEM_DEF(ipintel)
* Arguments:
* * target_ckey - The ckey to add/remove
*/
-/datum/controller/subsystem/ipintel/proc/vpn_whitelist_panel(target_ckey as text)
+/datum/ipintel_manager/proc/vpn_whitelist_panel(target_ckey as text)
if(!check_rights(R_ADMIN))
return
if(!target_ckey)
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index ddf3d239919..d019287a825 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -197,9 +197,9 @@
C.network |= "Power Alarms"
if(state)
- SSalarm.cancelAlarm("Power", src, source)
+ GLOB.alarm_manager.cancel_alarm("Power", src, source)
else
- SSalarm.triggerAlarm("Power", src, cameras, source)
+ GLOB.alarm_manager.trigger_alarm("Power", src, cameras, source)
/**
* Generate an atmospheric alert for this area
@@ -216,7 +216,7 @@
C.network |= "Atmosphere Alarms"
- SSalarm.triggerAlarm("Atmosphere", src, cameras, source)
+ GLOB.alarm_manager.trigger_alarm("Atmosphere", src, cameras, source)
else if(atmosalm == ATMOS_ALARM_DANGER)
for(var/thing in cameras)
@@ -224,7 +224,7 @@
if(!QDELETED(C) && is_station_level(C.z))
C.network -= "Atmosphere Alarms"
- SSalarm.cancelAlarm("Atmosphere", src, source)
+ GLOB.alarm_manager.cancel_alarm("Atmosphere", src, source)
atmosalm = danger_level
return TRUE
@@ -287,7 +287,7 @@
if(!QDELETED(C) && is_station_level(C.z))
C.network |= "Fire Alarms"
- SSalarm.triggerAlarm("Fire", src, cameras, source)
+ GLOB.alarm_manager.trigger_alarm("Fire", src, cameras, source)
START_PROCESSING(SSobj, src)
@@ -313,7 +313,7 @@
if(!QDELETED(C) && is_station_level(C.z))
C.network -= "Fire Alarms"
- SSalarm.cancelAlarm("Fire", src, source)
+ GLOB.alarm_manager.cancel_alarm("Fire", src, source)
STOP_PROCESSING(SSobj, src)
@@ -352,9 +352,9 @@
for(var/obj/machinery/door/DOOR in src)
close_and_lock_door(DOOR)
- if(SSalarm.triggerAlarm("Burglar", src, cameras, trigger))
+ if(GLOB.alarm_manager.trigger_alarm("Burglar", src, cameras, trigger))
//Cancel silicon alert after 1 minute
- addtimer(CALLBACK(SSalarm, TYPE_PROC_REF(/datum/controller/subsystem/alarm, cancelAlarm), "Burglar", src, trigger), 600)
+ addtimer(CALLBACK(GLOB.alarm_manager, TYPE_PROC_REF(/datum/alarm_manager, cancel_alarm), "Burglar", src, trigger), 1 MINUTES)
/**
* Trigger the fire alarm visual affects in an area
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 1dd080a1653..356eb81208f 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -178,7 +178,7 @@
if(escaped_on_pod_5)
SSblackbox.record_feedback("nested tally", "round_end_stats", escaped_on_pod_5, list("escapees", "on_pod_5"))
- SSdiscord.send2discord_simple(DISCORD_WEBHOOK_PRIMARY, "A round of [name] has ended - [surviving_total] survivors, [ghosts] ghosts.")
+ GLOB.discord_manager.send2discord_simple(DISCORD_WEBHOOK_PRIMARY, "A round of [name] has ended - [surviving_total] survivors, [ghosts] ghosts.")
return 0
diff --git a/code/game/machinery/camera/motion.dm b/code/game/machinery/camera/motion.dm
index d5a5a76d0d5..90482beeca7 100644
--- a/code/game/machinery/camera/motion.dm
+++ b/code/game/machinery/camera/motion.dm
@@ -45,7 +45,7 @@
/obj/machinery/camera/proc/cancelAlarm()
if(detectTime == -1)
if(status)
- SSalarm.cancelAlarm("Motion", get_area(src), src)
+ GLOB.alarm_manager.cancel_alarm("Motion", get_area(src), src)
detectTime = 0
return TRUE
@@ -53,7 +53,7 @@
if(!detectTime)
return FALSE
if(status)
- SSalarm.triggerAlarm("Motion", get_area(src), list(UID()), src)
+ GLOB.alarm_manager.trigger_alarm("Motion", get_area(src), list(UID()), src)
visible_message("A red light flashes on [src]!")
detectTime = -1
return TRUE
diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm
index be4fc32e50c..4b94acf7e21 100644
--- a/code/game/machinery/computer/station_alert.dm
+++ b/code/game/machinery/computer/station_alert.dm
@@ -12,8 +12,8 @@
/obj/machinery/computer/station_alert/Initialize(mapload)
. = ..()
- RegisterSignal(SSalarm, COMSIG_TRIGGERED_ALARM, PROC_REF(alarm_triggered))
- RegisterSignal(SSalarm, COMSIG_CANCELLED_ALARM, PROC_REF(alarm_cancelled))
+ RegisterSignal(GLOB.alarm_manager, COMSIG_TRIGGERED_ALARM, PROC_REF(alarm_triggered))
+ RegisterSignal(GLOB.alarm_manager, COMSIG_CANCELLED_ALARM, PROC_REF(alarm_cancelled))
/obj/machinery/computer/station_alert/attack_ai(mob/user)
@@ -38,12 +38,12 @@
var/list/data = list()
data["alarms"] = list()
- for(var/class in SSalarm.alarms)
+ for(var/class in GLOB.alarm_manager.alarms)
if(!(class in alarms_listend_for))
continue
data["alarms"][class] = list()
- for(var/area in SSalarm.alarms[class])
- for(var/thing in SSalarm.alarms[class][area][3])
+ for(var/area in GLOB.alarm_manager.alarms[class])
+ for(var/thing in GLOB.alarm_manager.alarms[class][area][3])
var/atom/A = locateUID(thing)
if(atoms_share_level(A, src))
data["alarms"][class] += area
@@ -70,7 +70,7 @@
/obj/machinery/computer/station_alert/update_icon_state()
var/active_alarms = FALSE
- var/list/list/temp_alarm_list = SSalarm.alarms.Copy()
+ var/list/list/temp_alarm_list = GLOB.alarm_manager.alarms.Copy()
for(var/cat in temp_alarm_list)
if(!(cat in alarms_listend_for))
continue
diff --git a/code/game/objects/structures/lavaland/necropolis_tendril.dm b/code/game/objects/structures/lavaland/necropolis_tendril.dm
index de5a76595f8..58bd619686c 100644
--- a/code/game/objects/structures/lavaland/necropolis_tendril.dm
+++ b/code/game/objects/structures/lavaland/necropolis_tendril.dm
@@ -44,17 +44,6 @@ GLOBAL_LIST_INIT(tendrils, list())
/obj/structure/spawner/lavaland/Destroy()
- var/last_tendril = TRUE
- if(GLOB.tendrils.len>1)
- last_tendril = FALSE
-
- if(last_tendril && !admin_spawned)
- if(SSmedals.hub_enabled)
- for(var/mob/living/L in view(7,src))
- if(L.stat || !L.client)
- continue
- SSmedals.UnlockMedal("[BOSS_MEDAL_TENDRIL] [ALL_KILL_MEDAL]", L.client)
- SSmedals.SetScore(TENDRIL_CLEAR_SCORE, L.client, 1)
GLOB.tendrils -= src
QDEL_NULL(emitted_light)
return ..()
diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm
index 63fa6427869..1587e6ab9f8 100644
--- a/code/modules/admin/IsBanned.dm
+++ b/code/modules/admin/IsBanned.dm
@@ -64,7 +64,7 @@
// As per my comment 8 or so lines above, we do NOT log failed connections here
//check if the IP address is a known proxy/vpn, and the user is not whitelisted
- if(check_ipintel && GLOB.configuration.ipintel.contact_email && GLOB.configuration.ipintel.whitelist_mode && SSipintel.ipintel_is_banned(key, address))
+ if(check_ipintel && GLOB.configuration.ipintel.contact_email && GLOB.configuration.ipintel.whitelist_mode && GLOB.ipintel_manager.ipintel_is_banned(key, address))
log_adminwarn("Failed Login: [key] [computer_id] [address] - Proxy/VPN")
var/mistakemessage = ""
if(GLOB.configuration.url.banappeals_url)
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 61e4ef388e9..8e37dfb7e6f 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -310,7 +310,7 @@ GLOBAL_VAR_INIT(nologevent, 0)
return
var/key = stripped_input(usr, "Enter ckey to add/remove, or leave blank to cancel:", "VPN Whitelist add/remove", max_length=32)
if(key)
- SSipintel.vpn_whitelist_panel(key)
+ GLOB.ipintel_manager.vpn_whitelist_panel(key)
/datum/admins/proc/Game()
if(!check_rights(R_ADMIN))
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 9c746b4149c..0140ea75190 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -69,6 +69,7 @@ GLOBAL_LIST_INIT(admin_verbs_admin, list(
/client/proc/ccbdb_lookup_ckey,
/client/proc/view_instances,
/client/proc/start_vote,
+ /client/proc/toggle_mctabs,
/client/proc/ping_all_admins,
/client/proc/show_watchlist
))
@@ -163,7 +164,6 @@ GLOBAL_LIST_INIT(admin_verbs_debug, list(
/client/proc/view_runtimes,
/client/proc/admin_serialize,
/client/proc/jump_to_ruin,
- /client/proc/toggle_medal_disable,
/client/proc/uid_log,
/client/proc/visualise_active_turfs,
/client/proc/reestablish_db_connection,
diff --git a/code/modules/admin/db_ban/functions.dm b/code/modules/admin/db_ban/functions.dm
index 3a33ff05246..e1c7d2b57fe 100644
--- a/code/modules/admin/db_ban/functions.dm
+++ b/code/modules/admin/db_ban/functions.dm
@@ -178,7 +178,7 @@
message_admins("[key_name_admin(usr)] has added a [bantype_str] for [ckey] [(job)?"([job])":""] [(duration > 0)?"([duration] minutes)":""] with the reason: \"[reason]\" to the ban database.",1)
if(announce_in_discord)
- SSdiscord.send2discord_simple(DISCORD_WEBHOOK_ADMIN, "**\[Ban]** [a_ckey] applied a [bantype_str] on [ckey]")
+ GLOB.discord_manager.send2discord_simple(DISCORD_WEBHOOK_ADMIN, "**\[Ban]** [a_ckey] applied a [bantype_str] on [ckey]")
if(kickbannedckey)
if(banned_mob && banned_mob.client && banned_mob.client.ckey == banckey)
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index 939bfd10f54..b2c1ee1607c 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -44,11 +44,11 @@ GLOBAL_LIST_INIT(adminhelp_ignored_words, list("unknown", "the", "a", "an", "of"
var/active_admins = admincount[1]
log_admin("[selected_type]: [key_name(src)]: [msg] - heard by [active_admins] non-AFK admins.")
- SSdiscord.send2discord_simple_noadmins("**\[Adminhelp]** [key_name(src)]: [msg]", check_send_always = TRUE)
+ GLOB.discord_manager.send2discord_simple_noadmins("**\[Adminhelp]** [key_name(src)]: [msg]", check_send_always = TRUE)
if("Mentorhelp")
var/list/mentorcount = staff_countup(R_MENTOR)
var/active_mentors = mentorcount[1]
log_admin("[selected_type]: [key_name(src)]: [msg] - heard by [active_mentors] non-AFK mentors.")
- SSdiscord.send2discord_simple_mentor("[key_name(src)]: [msg]")
+ GLOB.discord_manager.send2discord_simple_mentor("[key_name(src)]: [msg]")
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index 40dc21495ac..35ccbd1b0f4 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -235,7 +235,7 @@
to_chat(src, "[msg]")
return
- SSdiscord.send2discord_simple(DISCORD_WEBHOOK_ADMIN, "PM from [key_name(src)]: [html_decode(msg)]")
+ GLOB.discord_manager.send2discord_simple(DISCORD_WEBHOOK_ADMIN, "PM from [key_name(src)]: [html_decode(msg)]")
to_chat(src, "PM to-Discord Admins: [msg]")
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index e7561c70540..52d568d83bf 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -906,21 +906,6 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
SSblackbox.record_feedback("tally", "admin_verb", 1, "Jump To Ruin") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
-/client/proc/toggle_medal_disable()
- set category = "Debug"
- set name = "Toggle Medal Disable"
- set desc = "Toggles the safety lock on trying to contact the medal hub."
-
- if(!check_rights(R_DEBUG))
- return
-
- 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.")
-
-
/client/proc/visualise_active_turfs()
set category = "Debug"
set name = "Visualise Active Turfs"
diff --git a/code/modules/admin/verbs/manage_queue.dm b/code/modules/admin/verbs/manage_queue.dm
index 09d40c9dde2..20b78288b25 100644
--- a/code/modules/admin/verbs/manage_queue.dm
+++ b/code/modules/admin/verbs/manage_queue.dm
@@ -20,7 +20,7 @@
to_chat(usr, "Queue server is now [SSqueue.queue_enabled ? "Enabled" : "Disabled"]")
message_admins("[key_name_admin(usr)] has [SSqueue.queue_enabled ? "enabled" : "disabled"] the server queue.")
log_admin("[key_name(usr)] has [SSqueue.queue_enabled ? "enabled" : "disabled"] the server queue.")
- SSdiscord.send2discord_simple(DISCORD_WEBHOOK_ADMIN, "**\[Queue Server]** `[usr.ckey]` has now **[SSqueue.queue_enabled ? "enabled" : "disabled"]** the queue server.")
+ GLOB.discord_manager.send2discord_simple(DISCORD_WEBHOOK_ADMIN, "**\[Queue Server]** `[usr.ckey]` has now **[SSqueue.queue_enabled ? "enabled" : "disabled"]** the queue server.")
if("Set Threshold")
var/new_threshold = input(usr, "Enter new threshold", "Queue Server Manipulation", SSqueue.queue_threshold) as num|null
if(!new_threshold)
@@ -29,13 +29,13 @@
to_chat(usr, "Queue threshold is now [SSqueue.queue_threshold]")
message_admins("[key_name_admin(usr)] has set the queue threshold to [SSqueue.queue_threshold].")
log_admin("[key_name(usr)] has set the queue threshold to [SSqueue.queue_threshold].")
- SSdiscord.send2discord_simple(DISCORD_WEBHOOK_ADMIN, "**\[Queue Server]** `[usr.ckey]` has set the queue threshold to **[SSqueue.queue_threshold]**.")
+ GLOB.discord_manager.send2discord_simple(DISCORD_WEBHOOK_ADMIN, "**\[Queue Server]** `[usr.ckey]` has set the queue threshold to **[SSqueue.queue_threshold]**.")
if("Toggle Setting Persistence")
SSqueue.persist_queue = !SSqueue.persist_queue
to_chat(usr, "Queue server setting persistence is now [SSqueue.persist_queue ? "Enabled" : "Disabled"]")
message_admins("[key_name_admin(usr)] has [SSqueue.persist_queue ? "enabled" : "disabled"] the server queue settings persistence.")
log_admin("[key_name(usr)] has [SSqueue.persist_queue ? "enabled" : "disabled"] the server queue settings persistence.")
- SSdiscord.send2discord_simple(DISCORD_WEBHOOK_ADMIN, "**\[Queue Server]** `[usr.ckey]` has now **[SSqueue.persist_queue ? "enabled" : "disabled"]** server queue settings persistence.")
+ GLOB.discord_manager.send2discord_simple(DISCORD_WEBHOOK_ADMIN, "**\[Queue Server]** `[usr.ckey]` has now **[SSqueue.persist_queue ? "enabled" : "disabled"]** server queue settings persistence.")
/client/proc/add_queue_server_bypass()
set name = "Add Queue Server Bypass"
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index cf570a10bab..289f989d02a 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -607,11 +607,11 @@
log_debug("check_ip_intel: skip check for player [key_name_admin(src)] connecting from localhost.")
return
- if(SSipintel.vpn_whitelist_check(ckey))
+ if(GLOB.ipintel_manager.vpn_whitelist_check(ckey))
log_debug("check_ip_intel: skip check for player [key_name_admin(src)] [address] on whitelist.")
return
- var/datum/ipintel/res = SSipintel.get_ip_intel(address)
+ var/datum/ipintel/res = GLOB.ipintel_manager.get_ip_intel(address)
ip_intel = res.intel
verify_ip_intel()
@@ -797,7 +797,7 @@
if(!cidcheck_failedckeys[ckey])
message_admins("[key_name(src)] has been detected as using a CID randomizer. Connection rejected.")
- SSdiscord.send2discord_simple_noadmins("**\[Warning]** [key_name(src)] has been detected as using a CID randomizer. Connection rejected.")
+ GLOB.discord_manager.send2discord_simple_noadmins("**\[Warning]** [key_name(src)] has been detected as using a CID randomizer. Connection rejected.")
cidcheck_failedckeys[ckey] = TRUE
note_randomizer_user()
@@ -811,7 +811,7 @@
if(cidcheck_failedckeys[ckey])
// Atonement
message_admins("[key_name_admin(src)] has been allowed to connect after showing they removed their cid randomizer")
- SSdiscord.send2discord_simple_noadmins("**\[Info]** [key_name(src)] has been allowed to connect after showing they removed their cid randomizer.")
+ GLOB.discord_manager.send2discord_simple_noadmins("**\[Info]** [key_name(src)] has been allowed to connect after showing they removed their cid randomizer.")
cidcheck_failedckeys -= ckey
if(cidcheck_spoofckeys[ckey])
diff --git a/code/modules/client/login_processing/36-watchlist.dm b/code/modules/client/login_processing/36-watchlist.dm
index fa58d3b57f9..467595bdd82 100644
--- a/code/modules/client/login_processing/36-watchlist.dm
+++ b/code/modules/client/login_processing/36-watchlist.dm
@@ -11,5 +11,5 @@
if(Q.NextRow())
var/watchreason = Q.item[1]
message_admins("Notice: [key_name_admin(C)] is on the watchlist and has just connected - Reason: [watchreason]")
- SSdiscord.send2discord_simple_noadmins("**\[Watchlist]** [key_name(C)] is on the watchlist and has just connected - Reason: [watchreason]")
+ GLOB.discord_manager.send2discord_simple_noadmins("**\[Watchlist]** [key_name(C)] is on the watchlist and has just connected - Reason: [watchreason]")
C.watchlisted = TRUE
diff --git a/code/modules/client/preference/preferences_toggles.dm b/code/modules/client/preference/preferences_toggles.dm
index ed7b5f672af..08930805b2a 100644
--- a/code/modules/client/preference/preferences_toggles.dm
+++ b/code/modules/client/preference/preferences_toggles.dm
@@ -357,3 +357,11 @@
client.prefs.toggles2 ^= PREFTOGGLE_2_ANON
to_chat(src, "Your key will [(client.prefs.toggles2 & PREFTOGGLE_2_ANON) ? "no longer" : "now"] be shown in certain events (end round reports, deadchat, etc).")
client.prefs.save_preferences(src)
+
+/client/proc/toggle_mctabs()
+ set name = "Show/Hide MC Tabs"
+ set category = "Preferences"
+ set desc = "Shows or hides the MC tabs."
+ prefs.toggles2 ^= PREFTOGGLE_2_MC_TABS
+ prefs.save_preferences(src)
+ to_chat(src, "You will [(prefs.toggles2 & PREFTOGGLE_2_MC_TABS) ? "now" : "no longer"] see the MC tabs on the top right.")
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 55bd1a8b5bd..f125f55f0f5 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -271,7 +271,7 @@ GLOBAL_LIST_INIT(ai_verbs_default, list(
/mob/living/silicon/ai/proc/ai_alerts()
var/list/dat = list("Current Station Alerts\n")
dat += "Close
"
- var/list/list/temp_alarm_list = SSalarm.alarms.Copy()
+ var/list/list/temp_alarm_list = GLOB.alarm_manager.alarms.Copy()
for(var/cat in temp_alarm_list)
if(!(cat in alarms_listend_for))
continue
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 47f8047b850..a81d2099f93 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -607,7 +607,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
/mob/living/silicon/robot/proc/robot_alerts()
var/list/dat = list()
- var/list/list/temp_alarm_list = SSalarm.alarms.Copy()
+ var/list/list/temp_alarm_list = GLOB.alarm_manager.alarms.Copy()
for(var/cat in temp_alarm_list)
if(!(cat in alarms_listend_for))
continue
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 81cc4b5ccca..dbf61bd4bf9 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -46,8 +46,8 @@
..()
add_language("Galactic Common")
init_subsystems()
- RegisterSignal(SSalarm, COMSIG_TRIGGERED_ALARM, PROC_REF(alarm_triggered))
- RegisterSignal(SSalarm, COMSIG_CANCELLED_ALARM, PROC_REF(alarm_cancelled))
+ RegisterSignal(GLOB.alarm_manager, COMSIG_TRIGGERED_ALARM, PROC_REF(alarm_triggered))
+ RegisterSignal(GLOB.alarm_manager, COMSIG_CANCELLED_ALARM, PROC_REF(alarm_cancelled))
/mob/living/silicon/Initialize(mapload)
. = ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
index 70b85caea82..25e8046bf1f 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
@@ -589,9 +589,6 @@ Difficulty: Medium
butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 30)
attack_action_types = list()
-/mob/living/simple_animal/hostile/megafauna/dragon/lesser/grant_achievement(medaltype,scoretype)
- return
-
/mob/living/simple_animal/hostile/megafauna/dragon/space_dragon
name = "space dragon"
maxHealth = 250
@@ -616,9 +613,6 @@ Difficulty: Medium
deathmessage = "screeches as its wings turn to dust and it collapses on the floor, life estinguished."
attack_action_types = list()
-/mob/living/simple_animal/hostile/megafauna/dragon/space_dragon/grant_achievement(medaltype, scoretype)
- return
-
/mob/living/simple_animal/hostile/megafauna/dragon/space_dragon/Initialize(mapload)
var/obj/effect/proc_holder/spell/aoe/repulse/spacedragon/repulse_action = new /obj/effect/proc_holder/spell/aoe/repulse/spacedragon(src)
repulse_action.action.Grant(src)
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 ae855ed837d..79c2cfef046 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm
@@ -71,7 +71,6 @@
if(C && crusher_loot && C.total_damage >= maxHealth * 0.6)
spawn_crusher_loot()
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 ..()
@@ -127,20 +126,6 @@
recovery_time = world.time + buffer_time
ranged_cooldown = world.time + buffer_time
-/mob/living/simple_animal/hostile/megafauna/proc/grant_achievement(medaltype, scoretype, crusher_kill)
- if(!medal_type || admin_spawned || !SSmedals.hub_enabled) //Don't award medals if the medal type isn't set
- return FALSE
-
- for(var/mob/living/L in view(7,src))
- if(L.stat || !L.client)
- continue
- var/client/C = L.client
- SSmedals.UnlockMedal("Boss [BOSS_KILL_MEDAL]", C)
- SSmedals.UnlockMedal("[medaltype] [BOSS_KILL_MEDAL]", C)
- SSmedals.SetScore(BOSS_SCORE, C, 1)
- SSmedals.SetScore(score_type, C, 1)
- return TRUE
-
/datum/action/innate/megafauna_attack
name = "Megafauna Attack"
icon_icon = 'icons/mob/actions/actions_animal.dmi'
diff --git a/code/modules/mob/logout.dm b/code/modules/mob/logout.dm
index fd1d7579d08..50721b5085d 100644
--- a/code/modules/mob/logout.dm
+++ b/code/modules/mob/logout.dm
@@ -12,13 +12,13 @@
if(temp_admin.rights & R_MENTOR)
var/list/mentorcounter = staff_countup(R_MENTOR)
if(mentorcounter[1] == 0) // No active mentors
- SSdiscord.send2discord_simple(DISCORD_WEBHOOK_MENTOR, "[key_name(src)] logged out - 0 active mentors, [mentorcounter[2]] non-mentor staff, [mentorcounter[3]] inactive mentors.")
+ GLOB.discord_manager.send2discord_simple(DISCORD_WEBHOOK_MENTOR, "[key_name(src)] logged out - 0 active mentors, [mentorcounter[2]] non-mentor staff, [mentorcounter[3]] inactive mentors.")
else if(temp_admin.rights & R_BAN)
message_admins("Admin logout: [key_name_admin(src)]")
var/list/admincounter = staff_countup(R_BAN)
if(admincounter[1] == 0) // No active admins
- SSdiscord.send2discord_simple(DISCORD_WEBHOOK_ADMIN, "[key_name(src)] logged out - 0 active admins, [admincounter[2]] non-admin staff, [admincounter[3]] inactive staff.")
+ GLOB.discord_manager.send2discord_simple(DISCORD_WEBHOOK_ADMIN, "[key_name(src)] logged out - 0 active admins, [admincounter[2]] non-admin staff, [admincounter[3]] inactive staff.")
..()
update_morgue()
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 022167b32fc..a18de862013 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -978,8 +978,12 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
add_spell_to_statpanel(S)
// Allow admins + PR reviewers to VIEW the panel. Doesnt mean they can click things.
- if(is_admin(src) || check_rights(R_VIEWRUNTIMES, FALSE))
- if(statpanel("MC")) //looking at that panel
+ if((is_admin(src) || check_rights(R_VIEWRUNTIMES, FALSE)) && client?.prefs.toggles2 & PREFTOGGLE_2_MC_TABS)
+ // Below are checks to see which MC panel you are looking at
+
+ // Shows MC Metadata
+ if(statpanel("MC|M"))
+ stat("Info", "Showing MC metadata")
var/turf/T = get_turf(client.eye)
stat("Location:", COORD(T))
stat("CPU:", "[Master.formatcpu(world.cpu)]")
@@ -987,7 +991,6 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
stat("Instances:", "[num2text(world.contents.len, 10)]")
GLOB.stat_entry()
stat("Server Time:", time_stamp())
- stat(null)
if(Master)
Master.stat_entry()
else
@@ -996,10 +999,38 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
Failsafe.stat_entry()
else
stat("Failsafe Controller:", "ERROR")
+
+ // Shows subsystems with SS_NO_FIRE
+ if(statpanel("MC|N"))
+ stat("Info", "Showing subsystems that do not fire")
if(Master)
- stat(null)
- for(var/datum/controller/subsystem/SS in Master.subsystems)
- SS.stat_entry()
+ for(var/datum/controller/subsystem/SS as anything in Master.subsystems)
+ if(SS.flags & SS_NO_FIRE)
+ SS.stat_entry()
+
+ // Shows subsystems with the SS_CPUDISPLAY_LOW flag
+ if(statpanel("MC|L"))
+ stat("Info", "Showing subsystems marked as low intensity")
+ if(Master)
+ for(var/datum/controller/subsystem/SS as anything in Master.subsystems)
+ if((SS.cpu_display == SS_CPUDISPLAY_LOW) && !(SS.flags & SS_NO_FIRE))
+ SS.stat_entry()
+
+ // Shows subsystems with the SS_CPUDISPLAY_DEFAULT flag
+ if(statpanel("MC|D"))
+ stat("Info", "Showing subsystems marked as default intensity")
+ if(Master)
+ for(var/datum/controller/subsystem/SS as anything in Master.subsystems)
+ if((SS.cpu_display == SS_CPUDISPLAY_DEFAULT) && !(SS.flags & SS_NO_FIRE))
+ SS.stat_entry()
+
+ // Shows subsystems with the SS_CPUDISPLAY_HIGH flag
+ if(statpanel("MC|H"))
+ stat("Info", "Showing subsystems marked as high intensity")
+ if(Master)
+ for(var/datum/controller/subsystem/SS as anything in Master.subsystems)
+ if((SS.cpu_display == SS_CPUDISPLAY_HIGH) && !(SS.flags & SS_NO_FIRE))
+ SS.stat_entry()
statpanel("Status") // Switch to the Status panel again, for the sake of the lazy Stat procs
diff --git a/code/modules/unit_tests/subsystem_init.dm b/code/modules/unit_tests/subsystem_init.dm
index 7d5473bc1bb..1515f12c591 100644
--- a/code/modules/unit_tests/subsystem_init.dm
+++ b/code/modules/unit_tests/subsystem_init.dm
@@ -1,7 +1,9 @@
/datum/unit_test/subsystem_init/Run()
- for(var/i in Master.subsystems)
- var/datum/controller/subsystem/ss = i
- if(ss.flags & SS_NO_INIT)
- continue
- if(!ss.initialized)
- Fail("[ss]([ss.type]) is a subsystem meant to initialize but doesn't get set as initialized.")
+ var/datum/controller/subsystem/base_ss
+ var/default_offline_implications = initial(base_ss.offline_implications)
+ for(var/datum/controller/subsystem/SS as anything in Master.subsystems)
+ if((SS.flags & SS_NO_INIT) && (SS.flags & SS_NO_FIRE))
+ Fail("[SS]([SS.type]) is a subsystem which is set to not initialize or fire. Use a global datum instead an SS.")
+
+ if(!(SS.flags & SS_NO_FIRE) && SS.offline_implications == default_offline_implications)
+ Fail("[SS]([SS.type]) is a subsystem which fires but has no offline implications set.")
diff --git a/code/modules/unit_tests/subsystem_metric_sanity.dm b/code/modules/unit_tests/subsystem_metric_sanity.dm
index ad5bb254a60..250e6b4cc39 100644
--- a/code/modules/unit_tests/subsystem_metric_sanity.dm
+++ b/code/modules/unit_tests/subsystem_metric_sanity.dm
@@ -2,7 +2,7 @@
/datum/unit_test/subsystem_metric_sanity/Run()
for(var/datum/controller/subsystem/SS in Master.subsystems)
var/list/data = SS.get_metrics()
- if(length(data) != 3)
+ if(length(data) != 4)
Fail("SS[SS.ss_id] has invalid metrics data!")
continue
if(isnull(data["cost"]))
@@ -17,3 +17,6 @@
if(!islist(data["custom"]))
Fail("SS[SS.ss_id] has invalid metrics data! 'custom' is not a list in [json_encode(data)]")
continue
+ if(isnull(data["sleep_count"]))
+ Fail("SS[SS.ss_id] has invalid metrics data! No 'sleep_count' found in [json_encode(data)]")
+ continue
diff --git a/config/example/config.toml b/config/example/config.toml
index ad1eda5ce93..21246826bdc 100644
--- a/config/example/config.toml
+++ b/config/example/config.toml
@@ -718,10 +718,6 @@ lavaland_ruin_budget = 60
# Communications password for authorising world/Topic requests. Comment out to disable
#communications_password = "generateSomeLongRandomStringHere"
-# Medal hub for tracking lavaland stats
-#medal_hub_address = "hubmakerckey.hubname"
-# Medal hub password for tracking lavaland stats
-#medal_hub_password = "putYourPasswordHere"
# Do we want to kill the world on reboot instead of restarting it?
shutdown_on_reboot = false
# If true to above, an optional shell command can be ran. Defaults to killing DD on windows
diff --git a/paradise.dme b/paradise.dme
index 003ecbc84d6..4f8735b57fc 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -237,36 +237,25 @@
#include "code\controllers\subsystem\acid.dm"
#include "code\controllers\subsystem\afk.dm"
#include "code\controllers\subsystem\air.dm"
-#include "code\controllers\subsystem\alarm.dm"
#include "code\controllers\subsystem\ambience.dm"
-#include "code\controllers\subsystem\assets.dm"
-#include "code\controllers\subsystem\atoms.dm"
#include "code\controllers\subsystem\blackbox.dm"
-#include "code\controllers\subsystem\changelog.dm"
#include "code\controllers\subsystem\chat_pings.dm"
#include "code\controllers\subsystem\cleanup.dm"
#include "code\controllers\subsystem\dbcore.dm"
#include "code\controllers\subsystem\debugview.dm"
-#include "code\controllers\subsystem\discord.dm"
#include "code\controllers\subsystem\economy.dm"
#include "code\controllers\subsystem\events.dm"
#include "code\controllers\subsystem\fires.dm"
#include "code\controllers\subsystem\garbage.dm"
#include "code\controllers\subsystem\ghost_spawns.dm"
-#include "code\controllers\subsystem\holiday.dm"
#include "code\controllers\subsystem\http.dm"
#include "code\controllers\subsystem\icon_smooth.dm"
#include "code\controllers\subsystem\idlenpcpool.dm"
#include "code\controllers\subsystem\input.dm"
#include "code\controllers\subsystem\instancing.dm"
-#include "code\controllers\subsystem\ipintel.dm"
#include "code\controllers\subsystem\jobs.dm"
-#include "code\controllers\subsystem\late_mapping.dm"
#include "code\controllers\subsystem\lighting.dm"
#include "code\controllers\subsystem\machinery.dm"
-#include "code\controllers\subsystem\mapping.dm"
-#include "code\controllers\subsystem\maprotate.dm"
-#include "code\controllers\subsystem\medals.dm"
#include "code\controllers\subsystem\metrics.dm"
#include "code\controllers\subsystem\mobs.dm"
#include "code\controllers\subsystem\nano_mob_hunter.dm"
@@ -274,27 +263,33 @@
#include "code\controllers\subsystem\npcpool.dm"
#include "code\controllers\subsystem\overlays.dm"
#include "code\controllers\subsystem\parallax.dm"
-#include "code\controllers\subsystem\pathfinder.dm"
-#include "code\controllers\subsystem\persistent_data.dm"
#include "code\controllers\subsystem\profiler.dm"
#include "code\controllers\subsystem\radiation.dm"
-#include "code\controllers\subsystem\radio.dm"
#include "code\controllers\subsystem\redis.dm"
#include "code\controllers\subsystem\runechat.dm"
-#include "code\controllers\subsystem\server_queue.dm"
#include "code\controllers\subsystem\shuttles.dm"
-#include "code\controllers\subsystem\sounds.dm"
#include "code\controllers\subsystem\spacedrift.dm"
-#include "code\controllers\subsystem\statistics.dm"
#include "code\controllers\subsystem\sun.dm"
#include "code\controllers\subsystem\tgui.dm"
#include "code\controllers\subsystem\throwing.dm"
#include "code\controllers\subsystem\ticker.dm"
#include "code\controllers\subsystem\time_track.dm"
#include "code\controllers\subsystem\timer.dm"
-#include "code\controllers\subsystem\titlescreen.dm"
#include "code\controllers\subsystem\vote.dm"
#include "code\controllers\subsystem\weather.dm"
+#include "code\controllers\subsystem\non_firing\assets.dm"
+#include "code\controllers\subsystem\non_firing\atoms.dm"
+#include "code\controllers\subsystem\non_firing\changelog.dm"
+#include "code\controllers\subsystem\non_firing\holiday.dm"
+#include "code\controllers\subsystem\non_firing\late_mapping.dm"
+#include "code\controllers\subsystem\non_firing\mapping.dm"
+#include "code\controllers\subsystem\non_firing\maprotate.dm"
+#include "code\controllers\subsystem\non_firing\pathfinder.dm"
+#include "code\controllers\subsystem\non_firing\persistent_data.dm"
+#include "code\controllers\subsystem\non_firing\radio.dm"
+#include "code\controllers\subsystem\non_firing\server_queue.dm"
+#include "code\controllers\subsystem\non_firing\sounds.dm"
+#include "code\controllers\subsystem\non_firing\titlescreen.dm"
#include "code\controllers\subsystem\processing\dcs.dm"
#include "code\controllers\subsystem\processing\fastprocess.dm"
#include "code\controllers\subsystem\processing\fields.dm"
@@ -307,6 +302,7 @@
#include "code\datums\action.dm"
#include "code\datums\ai_law_sets.dm"
#include "code\datums\ai_laws.dm"
+#include "code\datums\alarm_manager.dm"
#include "code\datums\armor.dm"
#include "code\datums\beam.dm"
#include "code\datums\browser.dm"
@@ -317,13 +313,13 @@
#include "code\datums\datacore.dm"
#include "code\datums\datum.dm"
#include "code\datums\datumvars.dm"
-#include "code\datums\discord.dm"
#include "code\datums\dog_fashion.dm"
#include "code\datums\emote.dm"
#include "code\datums\holocall.dm"
#include "code\datums\http.dm"
#include "code\datums\hud.dm"
#include "code\datums\input_data.dm"
+#include "code\datums\ipintel.dm"
#include "code\datums\log_record.dm"
#include "code\datums\log_viewer.dm"
#include "code\datums\logging.dm"
@@ -374,6 +370,8 @@
#include "code\datums\components\squeak.dm"
#include "code\datums\components\surgery_initiator.dm"
#include "code\datums\components\swarming.dm"
+#include "code\datums\discord\discord_manager.dm"
+#include "code\datums\discord\discord_webhook.dm"
#include "code\datums\diseases\_disease.dm"
#include "code\datums\diseases\_MobProcs.dm"
#include "code\datums\diseases\anxiety.dm"