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"