diff --git a/Content.Shared/CCVar/CCVars.Accessibility.cs b/Content.Shared/CCVar/CCVars.Accessibility.cs
new file mode 100644
index 00000000000000..8eb61f0806d272
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Accessibility.cs
@@ -0,0 +1,41 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ ///
+ /// Chat window opacity slider, controlling the alpha of the chat window background.
+ /// Goes from to 0 (completely transparent) to 1 (completely opaque)
+ ///
+ public static readonly CVarDef ChatWindowOpacity =
+ CVarDef.Create("accessibility.chat_window_transparency", 0.85f, CVar.CLIENTONLY | CVar.ARCHIVE);
+
+ ///
+ /// Toggle for visual effects that may potentially cause motion sickness.
+ /// Where reasonable, effects affected by this CVar should use an alternate effect.
+ /// Please do not use this CVar as a bandaid for effects that could otherwise be made accessible without issue.
+ ///
+ public static readonly CVarDef ReducedMotion =
+ CVarDef.Create("accessibility.reduced_motion", false, CVar.CLIENTONLY | CVar.ARCHIVE);
+
+ public static readonly CVarDef ChatEnableColorName =
+ CVarDef.Create("accessibility.enable_color_name",
+ true,
+ CVar.CLIENTONLY | CVar.ARCHIVE,
+ "Toggles displaying names with individual colors.");
+
+ ///
+ /// Screen shake intensity slider, controlling the intensity of the CameraRecoilSystem.
+ /// Goes from 0 (no recoil at all) to 1 (regular amounts of recoil)
+ ///
+ public static readonly CVarDef ScreenShakeIntensity =
+ CVarDef.Create("accessibility.screen_shake_intensity", 1f, CVar.CLIENTONLY | CVar.ARCHIVE);
+
+ ///
+ /// A generic toggle for various visual effects that are color sensitive.
+ /// As of 2/16/24, only applies to progress bar colors.
+ ///
+ public static readonly CVarDef AccessibilityColorblindFriendly =
+ CVarDef.Create("accessibility.colorblind_friendly", false, CVar.CLIENTONLY | CVar.ARCHIVE);
+}
diff --git a/Content.Shared/CCVar/CCVars.Admin.Ahelp.cs b/Content.Shared/CCVar/CCVars.Admin.Ahelp.cs
new file mode 100644
index 00000000000000..48f3965bb5c7b3
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Admin.Ahelp.cs
@@ -0,0 +1,39 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ ///
+ /// Ahelp rate limit values are accounted in periods of this size (seconds).
+ /// After the period has passed, the count resets.
+ ///
+ ///
+ public static readonly CVarDef AhelpRateLimitPeriod =
+ CVarDef.Create("ahelp.rate_limit_period", 2f, CVar.SERVERONLY);
+
+ ///
+ /// How many ahelp messages are allowed in a single rate limit period.
+ ///
+ ///
+ public static readonly CVarDef AhelpRateLimitCount =
+ CVarDef.Create("ahelp.rate_limit_count", 10, CVar.SERVERONLY);
+
+ ///
+ /// Should the administrator's position be displayed in ahelp.
+ /// If it is is false, only the admin's ckey will be displayed in the ahelp.
+ ///
+ ///
+ ///
+ public static readonly CVarDef AhelpAdminPrefix =
+ CVarDef.Create("ahelp.admin_prefix", false, CVar.SERVERONLY);
+
+ ///
+ /// Should the administrator's position be displayed in the webhook.
+ /// If it is is false, only the admin's ckey will be displayed in webhook.
+ ///
+ ///
+ ///
+ public static readonly CVarDef AhelpAdminPrefixWebhook =
+ CVarDef.Create("ahelp.admin_prefix_webhook", false, CVar.SERVERONLY);
+}
diff --git a/Content.Shared/CCVar/CCVars.Admin.Logs.cs b/Content.Shared/CCVar/CCVars.Admin.Logs.cs
new file mode 100644
index 00000000000000..862456ddfdd926
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Admin.Logs.cs
@@ -0,0 +1,42 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ ///
+ /// Controls if admin logs are enabled. Highly recommended to shut this off for development.
+ ///
+ public static readonly CVarDef AdminLogsEnabled =
+ CVarDef.Create("adminlogs.enabled", true, CVar.SERVERONLY);
+
+ public static readonly CVarDef AdminLogsQueueSendDelay =
+ CVarDef.Create("adminlogs.queue_send_delay_seconds", 5f, CVar.SERVERONLY);
+
+ ///
+ /// When to skip the waiting time to save in-round admin logs, if no admin logs are currently being saved
+ ///
+ public static readonly CVarDef AdminLogsQueueMax =
+ CVarDef.Create("adminlogs.queue_max", 5000, CVar.SERVERONLY);
+
+ ///
+ /// When to skip the waiting time to save pre-round admin logs, if no admin logs are currently being saved
+ ///
+ public static readonly CVarDef AdminLogsPreRoundQueueMax =
+ CVarDef.Create("adminlogs.pre_round_queue_max", 5000, CVar.SERVERONLY);
+
+ ///
+ /// When to start dropping logs
+ ///
+ public static readonly CVarDef AdminLogsDropThreshold =
+ CVarDef.Create("adminlogs.drop_threshold", 20000, CVar.SERVERONLY);
+
+ ///
+ /// How many logs to send to the client at once
+ ///
+ public static readonly CVarDef AdminLogsClientBatchSize =
+ CVarDef.Create("adminlogs.client_batch_size", 1000, CVar.SERVERONLY);
+
+ public static readonly CVarDef AdminLogsServerName =
+ CVarDef.Create("adminlogs.server_name", "unknown", CVar.SERVERONLY);
+}
diff --git a/Content.Shared/CCVar/CCVars.Admin.Rules.cs b/Content.Shared/CCVar/CCVars.Admin.Rules.cs
new file mode 100644
index 00000000000000..7385104364b512
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Admin.Rules.cs
@@ -0,0 +1,18 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ ///
+ /// Time that players have to wait before rules can be accepted.
+ ///
+ public static readonly CVarDef RulesWaitTime =
+ CVarDef.Create("rules.time", 45f, CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// Don't show rules to localhost/loopback interface.
+ ///
+ public static readonly CVarDef RulesExemptLocal =
+ CVarDef.Create("rules.exempt_local", true, CVar.SERVERONLY);
+}
diff --git a/Content.Shared/CCVar/CCVars.Admin.cs b/Content.Shared/CCVar/CCVars.Admin.cs
new file mode 100644
index 00000000000000..28bebfbe8a6521
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Admin.cs
@@ -0,0 +1,163 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ public static readonly CVarDef AdminAnnounceLogin =
+ CVarDef.Create("admin.announce_login", true, CVar.SERVERONLY);
+
+ public static readonly CVarDef AdminAnnounceLogout =
+ CVarDef.Create("admin.announce_logout", true, CVar.SERVERONLY);
+
+ ///
+ /// The token used to authenticate with the admin API. Leave empty to disable the admin API. This is a secret! Do not share!
+ ///
+ public static readonly CVarDef AdminApiToken =
+ CVarDef.Create("admin.api_token", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL);
+
+ ///
+ /// Should users be able to see their own notes? Admins will be able to see and set notes regardless
+ ///
+ public static readonly CVarDef SeeOwnNotes =
+ CVarDef.Create("admin.see_own_notes", false, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
+
+ ///
+ /// Should the server play a quick sound to the active admins whenever a new player joins?
+ ///
+ public static readonly CVarDef AdminNewPlayerJoinSound =
+ CVarDef.Create("admin.new_player_join_sound", false, CVar.SERVERONLY);
+
+ ///
+ /// The amount of days before the note starts fading. It will slowly lose opacity until it reaches stale. Set to 0 to disable.
+ ///
+ public static readonly CVarDef NoteFreshDays =
+ CVarDef.Create("admin.note_fresh_days", 91.31055, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
+
+ ///
+ /// The amount of days before the note completely fades, and can only be seen by admins if they press "see more notes". Set to 0
+ /// if you want the note to immediately disappear without fading.
+ ///
+ public static readonly CVarDef NoteStaleDays =
+ CVarDef.Create("admin.note_stale_days", 365.2422, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
+
+ ///
+ /// How much time does the user have to wait in seconds before confirming that they saw an admin message?
+ ///
+ public static readonly CVarDef MessageWaitTime =
+ CVarDef.Create("admin.message_wait_time", 3f, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
+
+ ///
+ /// Default severity for role bans
+ ///
+ public static readonly CVarDef RoleBanDefaultSeverity =
+ CVarDef.Create("admin.role_ban_default_severity", "medium", CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// Default severity for department bans
+ ///
+ public static readonly CVarDef DepartmentBanDefaultSeverity =
+ CVarDef.Create("admin.department_ban_default_severity", "medium", CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// Default severity for server bans
+ ///
+ public static readonly CVarDef ServerBanDefaultSeverity =
+ CVarDef.Create("admin.server_ban_default_severity", "High", CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// Whether a server ban will ban the player's ip by default.
+ ///
+ public static readonly CVarDef ServerBanIpBanDefault =
+ CVarDef.Create("admin.server_ban_ip_ban_default", true, CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// Whether a server ban will ban the player's hardware id by default.
+ ///
+ public static readonly CVarDef ServerBanHwidBanDefault =
+ CVarDef.Create("admin.server_ban_hwid_ban_default", true, CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// Whether to use details from last connection for ip/hwid in the BanPanel.
+ ///
+ public static readonly CVarDef ServerBanUseLastDetails =
+ CVarDef.Create("admin.server_ban_use_last_details", true, CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// Whether to erase a player's chat messages and their entity from the game when banned.
+ ///
+ public static readonly CVarDef ServerBanErasePlayer =
+ CVarDef.Create("admin.server_ban_erase_player", false, CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// Minimum players sharing a connection required to create an alert. -1 to disable the alert.
+ ///
+ ///
+ /// If you set this to 0 or 1 then it will alert on every connection, so probably don't do that.
+ ///
+ public static readonly CVarDef AdminAlertMinPlayersSharingConnection =
+ CVarDef.Create("admin.alert.min_players_sharing_connection", -1, CVar.SERVERONLY);
+
+ ///
+ /// Minimum explosion intensity to create an admin alert message. -1 to disable the alert.
+ ///
+ public static readonly CVarDef AdminAlertExplosionMinIntensity =
+ CVarDef.Create("admin.alert.explosion_min_intensity", 60, CVar.SERVERONLY);
+
+ ///
+ /// Minimum particle accelerator strength to create an admin alert message.
+ ///
+ public static readonly CVarDef AdminAlertParticleAcceleratorMinPowerState =
+ CVarDef.Create("admin.alert.particle_accelerator_min_power_state", 5, CVar.SERVERONLY); // strength 4
+
+ ///
+ /// Should the ban details in admin channel include PII? (IP, HWID, etc)
+ ///
+ public static readonly CVarDef AdminShowPIIOnBan =
+ CVarDef.Create("admin.show_pii_onban", false, CVar.SERVERONLY);
+
+ ///
+ /// If an admin joins a round by reading up or using the late join button, automatically
+ /// de-admin them.
+ ///
+ public static readonly CVarDef AdminDeadminOnJoin =
+ CVarDef.Create("admin.deadmin_on_join", false, CVar.SERVERONLY);
+
+ ///
+ /// Overrides the name the client sees in ahelps. Set empty to disable.
+ ///
+ public static readonly CVarDef AdminAhelpOverrideClientName =
+ CVarDef.Create("admin.override_adminname_in_client_ahelp", string.Empty, CVar.SERVERONLY);
+
+ ///
+ /// The threshold of minutes to appear as a "new player" in the ahelp menu
+ /// If 0, appearing as a new player is disabled.
+ ///
+ public static readonly CVarDef NewPlayerThreshold =
+ CVarDef.Create("admin.new_player_threshold", 0, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
+
+ ///
+ /// How long an admin client can go without any input before being considered AFK.
+ ///
+ public static readonly CVarDef AdminAfkTime =
+ CVarDef.Create("admin.afk_time", 600f, CVar.SERVERONLY);
+
+ ///
+ /// If true, admins are able to connect even if
+ /// would otherwise block regular players.
+ ///
+ public static readonly CVarDef AdminBypassMaxPlayers =
+ CVarDef.Create("admin.bypass_max_players", true, CVar.SERVERONLY);
+
+ ///
+ /// Determine if custom rank names are used.
+ /// If it is false, it'd use the actual rank name regardless of the individual's title.
+ ///
+ ///
+ ///
+ public static readonly CVarDef AdminUseCustomNamesAdminRank =
+ CVarDef.Create("admin.use_custom_names_admin_rank", true, CVar.SERVERONLY);
+
+ public static readonly CVarDef BanHardwareIds =
+ CVarDef.Create("ban.hardware_ids", true, CVar.SERVERONLY);
+}
diff --git a/Content.Shared/CCVar/CCVars.Atmos.cs b/Content.Shared/CCVar/CCVars.Atmos.cs
new file mode 100644
index 00000000000000..cc1069b4fc8752
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Atmos.cs
@@ -0,0 +1,153 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ ///
+ /// Whether gas differences will move entities.
+ ///
+ public static readonly CVarDef SpaceWind =
+ CVarDef.Create("atmos.space_wind", false, CVar.SERVERONLY);
+
+ ///
+ /// Divisor from maxForce (pressureDifference * 2.25f) to force applied on objects.
+ ///
+ public static readonly CVarDef SpaceWindPressureForceDivisorThrow =
+ CVarDef.Create("atmos.space_wind_pressure_force_divisor_throw", 15f, CVar.SERVERONLY);
+
+ ///
+ /// Divisor from maxForce (pressureDifference * 2.25f) to force applied on objects.
+ ///
+ public static readonly CVarDef SpaceWindPressureForceDivisorPush =
+ CVarDef.Create("atmos.space_wind_pressure_force_divisor_push", 2500f, CVar.SERVERONLY);
+
+ ///
+ /// The maximum velocity (not force) that may be applied to an object by atmospheric pressure differences.
+ /// Useful to prevent clipping through objects.
+ ///
+ public static readonly CVarDef SpaceWindMaxVelocity =
+ CVarDef.Create("atmos.space_wind_max_velocity", 30f, CVar.SERVERONLY);
+
+ ///
+ /// The maximum force that may be applied to an object by pushing (i.e. not throwing) atmospheric pressure differences.
+ /// A "throwing" atmospheric pressure difference ignores this limit, but not the max. velocity limit.
+ ///
+ public static readonly CVarDef SpaceWindMaxPushForce =
+ CVarDef.Create("atmos.space_wind_max_push_force", 20f, CVar.SERVERONLY);
+
+ ///
+ /// Whether monstermos tile equalization is enabled.
+ ///
+ public static readonly CVarDef MonstermosEqualization =
+ CVarDef.Create("atmos.monstermos_equalization", true, CVar.SERVERONLY);
+
+ ///
+ /// Whether monstermos explosive depressurization is enabled.
+ /// Needs to be enabled to work.
+ ///
+ public static readonly CVarDef MonstermosDepressurization =
+ CVarDef.Create("atmos.monstermos_depressurization", true, CVar.SERVERONLY);
+
+ ///
+ /// Whether monstermos explosive depressurization will rip tiles..
+ /// Needs and to be enabled to work.
+ /// WARNING: This cvar causes MAJOR contrast issues, and usually tends to make any spaced scene look very cluttered.
+ /// This not only usually looks strange, but can also reduce playability for people with impaired vision. Please think twice before enabling this on your server.
+ /// Also looks weird on slow spacing for unrelated reasons. If you do want to enable this, you should probably turn on instaspacing.
+ ///
+ public static readonly CVarDef MonstermosRipTiles =
+ CVarDef.Create("atmos.monstermos_rip_tiles", false, CVar.SERVERONLY);
+
+ ///
+ /// Whether explosive depressurization will cause the grid to gain an impulse.
+ /// Needs and to be enabled to work.
+ ///
+ public static readonly CVarDef AtmosGridImpulse =
+ CVarDef.Create("atmos.grid_impulse", false, CVar.SERVERONLY);
+
+ ///
+ /// What fraction of air from a spaced tile escapes every tick.
+ /// 1.0 for instant spacing, 0.2 means 20% of remaining air lost each time
+ ///
+ public static readonly CVarDef AtmosSpacingEscapeRatio =
+ CVarDef.Create("atmos.mmos_spacing_speed", 0.15f, CVar.SERVERONLY);
+
+ ///
+ /// Minimum amount of air allowed on a spaced tile before it is reset to 0 immediately in kPa
+ /// Since the decay due to SpacingEscapeRatio follows a curve, it would never reach 0.0 exactly
+ /// unless we truncate it somewhere.
+ ///
+ public static readonly CVarDef AtmosSpacingMinGas =
+ CVarDef.Create("atmos.mmos_min_gas", 2.0f, CVar.SERVERONLY);
+
+ ///
+ /// How much wind can go through a single tile before that tile doesn't depressurize itself
+ /// (I.e spacing is limited in large rooms heading into smaller spaces)
+ ///
+ public static readonly CVarDef AtmosSpacingMaxWind =
+ CVarDef.Create("atmos.mmos_max_wind", 500f, CVar.SERVERONLY);
+
+ ///
+ /// Whether atmos superconduction is enabled.
+ ///
+ /// Disabled by default, superconduction is awful.
+ public static readonly CVarDef Superconduction =
+ CVarDef.Create("atmos.superconduction", false, CVar.SERVERONLY);
+
+ ///
+ /// Heat loss per tile due to radiation at 20 degC, in W.
+ ///
+ public static readonly CVarDef SuperconductionTileLoss =
+ CVarDef.Create("atmos.superconduction_tile_loss", 30f, CVar.SERVERONLY);
+
+ ///
+ /// Whether excited groups will be processed and created.
+ ///
+ public static readonly CVarDef ExcitedGroups =
+ CVarDef.Create("atmos.excited_groups", true, CVar.SERVERONLY);
+
+ ///
+ /// Whether all tiles in an excited group will clear themselves once being exposed to space.
+ /// Similar to , without none of the tile ripping or
+ /// things being thrown around very violently.
+ /// Needs to be enabled to work.
+ ///
+ public static readonly CVarDef ExcitedGroupsSpaceIsAllConsuming =
+ CVarDef.Create("atmos.excited_groups_space_is_all_consuming", false, CVar.SERVERONLY);
+
+ ///
+ /// Maximum time in milliseconds that atmos can take processing.
+ ///
+ public static readonly CVarDef AtmosMaxProcessTime =
+ CVarDef.Create("atmos.max_process_time", 3f, CVar.SERVERONLY);
+
+ ///
+ /// Atmos tickrate in TPS. Atmos processing will happen every 1/TPS seconds.
+ ///
+ public static readonly CVarDef AtmosTickRate =
+ CVarDef.Create("atmos.tickrate", 15f, CVar.SERVERONLY);
+
+ ///
+ /// Scale factor for how fast things happen in our atmosphere
+ /// simulation compared to real life. 1x means pumps run at 1x
+ /// speed. Players typically expect things to happen faster
+ /// in-game.
+ ///
+ public static readonly CVarDef AtmosSpeedup =
+ CVarDef.Create("atmos.speedup", 8f, CVar.SERVERONLY);
+
+ ///
+ /// Like atmos.speedup, but only for gas and reaction heat values. 64x means
+ /// gases heat up and cool down 64x faster than real life.
+ ///
+ public static readonly CVarDef AtmosHeatScale =
+ CVarDef.Create("atmos.heat_scale", 8f, CVar.SERVERONLY);
+
+ ///
+ /// Maximum explosion radius for explosions caused by bursting a gas tank ("max caps").
+ /// Setting this to zero disables the explosion but still allows the tank to burst and leak.
+ ///
+ public static readonly CVarDef AtmosTankFragment =
+ CVarDef.Create("atmos.max_explosion_range", 26f, CVar.SERVERONLY);
+}
diff --git a/Content.Shared/CCVar/CCVars.Audio.cs b/Content.Shared/CCVar/CCVars.Audio.cs
new file mode 100644
index 00000000000000..4d9e7c44315ffa
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Audio.cs
@@ -0,0 +1,61 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ ///
+ /// How long we'll wait until re-sampling nearby objects for ambience. Should be pretty fast, but doesn't have to match the tick rate.
+ ///
+ public static readonly CVarDef AmbientCooldown =
+ CVarDef.Create("ambience.cooldown", 0.1f, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+ ///
+ /// How large of a range to sample for ambience.
+ ///
+ public static readonly CVarDef AmbientRange =
+ CVarDef.Create("ambience.range", 8f, CVar.REPLICATED | CVar.SERVER);
+
+ ///
+ /// Maximum simultaneous ambient sounds.
+ ///
+ public static readonly CVarDef MaxAmbientSources =
+ CVarDef.Create("ambience.max_sounds", 16, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+ ///
+ /// The minimum value the user can set for ambience.max_sounds
+ ///
+ public static readonly CVarDef MinMaxAmbientSourcesConfigured =
+ CVarDef.Create("ambience.min_max_sounds_configured", 16, CVar.REPLICATED | CVar.SERVER | CVar.CHEAT);
+
+ ///
+ /// The maximum value the user can set for ambience.max_sounds
+ ///
+ public static readonly CVarDef MaxMaxAmbientSourcesConfigured =
+ CVarDef.Create("ambience.max_max_sounds_configured", 64, CVar.REPLICATED | CVar.SERVER | CVar.CHEAT);
+
+ ///
+ /// Ambience volume.
+ ///
+ public static readonly CVarDef AmbienceVolume =
+ CVarDef.Create("ambience.volume", 1.5f, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+ ///
+ /// Ambience music volume.
+ ///
+ public static readonly CVarDef AmbientMusicVolume =
+ CVarDef.Create("ambience.music_volume", 1.5f, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+ ///
+ /// Lobby / round end music volume.
+ ///
+ public static readonly CVarDef LobbyMusicVolume =
+ CVarDef.Create("ambience.lobby_music_volume", 0.50f, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+ ///
+ /// UI volume.
+ ///
+ public static readonly CVarDef InterfaceVolume =
+ CVarDef.Create("audio.interface_volume", 0.50f, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+}
diff --git a/Content.Shared/CCVar/CCVars.Chat.Looc.cs b/Content.Shared/CCVar/CCVars.Chat.Looc.cs
new file mode 100644
index 00000000000000..84ee2c280723c8
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Chat.Looc.cs
@@ -0,0 +1,26 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ public static readonly CVarDef LoocEnabled =
+ CVarDef.Create("looc.enabled", true, CVar.NOTIFY | CVar.REPLICATED);
+
+ public static readonly CVarDef AdminLoocEnabled =
+ CVarDef.Create("looc.enabled_admin", true, CVar.NOTIFY);
+
+ ///
+ /// True: Dead players can use LOOC
+ /// False: Dead player LOOC gets redirected to dead chat
+ ///
+ public static readonly CVarDef DeadLoocEnabled =
+ CVarDef.Create("looc.enabled_dead", false, CVar.NOTIFY | CVar.REPLICATED);
+
+ ///
+ /// True: Crit players can use LOOC
+ /// False: Crit player LOOC gets redirected to dead chat
+ ///
+ public static readonly CVarDef CritLoocEnabled =
+ CVarDef.Create("looc.enabled_crit", false, CVar.NOTIFY | CVar.REPLICATED);
+}
diff --git a/Content.Shared/CCVar/CCVars.Chat.Ooc.cs b/Content.Shared/CCVar/CCVars.Chat.Ooc.cs
new file mode 100644
index 00000000000000..ba5e41053b6d85
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Chat.Ooc.cs
@@ -0,0 +1,27 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ public static readonly CVarDef
+ OocEnabled = CVarDef.Create("ooc.enabled", true, CVar.NOTIFY | CVar.REPLICATED);
+
+ public static readonly CVarDef AdminOocEnabled =
+ CVarDef.Create("ooc.enabled_admin", true, CVar.NOTIFY);
+
+ ///
+ /// If true, whenever OOC is disabled the Discord OOC relay will also be disabled.
+ ///
+ public static readonly CVarDef DisablingOOCDisablesRelay =
+ CVarDef.Create("ooc.disabling_ooc_disables_relay", true, CVar.SERVERONLY);
+
+ ///
+ /// Whether or not OOC chat should be enabled during a round.
+ ///
+ public static readonly CVarDef OocEnableDuringRound =
+ CVarDef.Create("ooc.enable_during_round", false, CVar.NOTIFY | CVar.REPLICATED | CVar.SERVER);
+
+ public static readonly CVarDef ShowOocPatronColor =
+ CVarDef.Create("ooc.show_ooc_patron_color", true, CVar.ARCHIVE | CVar.REPLICATED | CVar.CLIENT);
+}
diff --git a/Content.Shared/CCVar/CCVars.Chat.cs b/Content.Shared/CCVar/CCVars.Chat.cs
new file mode 100644
index 00000000000000..139a82372a266e
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Chat.cs
@@ -0,0 +1,68 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ ///
+ /// Chat rate limit values are accounted in periods of this size (seconds).
+ /// After the period has passed, the count resets.
+ ///
+ ///
+ public static readonly CVarDef ChatRateLimitPeriod =
+ CVarDef.Create("chat.rate_limit_period", 2f, CVar.SERVERONLY);
+
+ ///
+ /// How many chat messages are allowed in a single rate limit period.
+ ///
+ ///
+ /// The total rate limit throughput per second is effectively
+ /// divided by .
+ ///
+ ///
+ public static readonly CVarDef ChatRateLimitCount =
+ CVarDef.Create("chat.rate_limit_count", 10, CVar.SERVERONLY);
+
+ ///
+ /// Minimum delay (in seconds) between notifying admins about chat message rate limit violations.
+ /// A negative value disables admin announcements.
+ ///
+ public static readonly CVarDef ChatRateLimitAnnounceAdminsDelay =
+ CVarDef.Create("chat.rate_limit_announce_admins_delay", 15, CVar.SERVERONLY);
+
+ public static readonly CVarDef ChatMaxMessageLength =
+ CVarDef.Create("chat.max_message_length", 1000, CVar.SERVER | CVar.REPLICATED);
+
+ public static readonly CVarDef ChatMaxAnnouncementLength =
+ CVarDef.Create("chat.max_announcement_length", 256, CVar.SERVER | CVar.REPLICATED);
+
+ public static readonly CVarDef ChatSanitizerEnabled =
+ CVarDef.Create("chat.chat_sanitizer_enabled", true, CVar.SERVERONLY);
+
+ public static readonly CVarDef ChatShowTypingIndicator =
+ CVarDef.Create("chat.show_typing_indicator", true, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
+
+ public static readonly CVarDef ChatEnableFancyBubbles =
+ CVarDef.Create("chat.enable_fancy_bubbles",
+ true,
+ CVar.CLIENTONLY | CVar.ARCHIVE,
+ "Toggles displaying fancy speech bubbles, which display the speaking character's name.");
+
+ public static readonly CVarDef ChatFancyNameBackground =
+ CVarDef.Create("chat.fancy_name_background",
+ false,
+ CVar.CLIENTONLY | CVar.ARCHIVE,
+ "Toggles displaying a background under the speaking character's name.");
+
+ ///
+ /// A message broadcast to each player that joins the lobby.
+ /// May be changed by admins ingame through use of the "set-motd" command.
+ /// In this case the new value, if not empty, is broadcast to all connected players and saved between rounds.
+ /// May be requested by any player through use of the "get-motd" command.
+ ///
+ public static readonly CVarDef MOTD =
+ CVarDef.Create("chat.motd",
+ "",
+ CVar.SERVER | CVar.SERVERONLY | CVar.ARCHIVE,
+ "A message broadcast to each player that joins the lobby.");
+}
diff --git a/Content.Shared/CCVar/CCVars.Config.cs b/Content.Shared/CCVar/CCVars.Config.cs
new file mode 100644
index 00000000000000..4e11f09ee7ce3d
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Config.cs
@@ -0,0 +1,35 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ // These are server-only for now since I don't foresee a client use yet,
+ // and I don't wanna have to start coming up with like .client suffixes and stuff like that.
+
+ ///
+ /// Configuration presets to load during startup.
+ /// Multiple presets can be separated by comma and are loaded in order.
+ ///
+ ///
+ /// Loaded presets must be located under the ConfigPresets/ resource directory and end with the .toml extension.
+ /// Only the file name (without extension) must be given for this variable.
+ ///
+ public static readonly CVarDef ConfigPresets =
+ CVarDef.Create("config.presets", "", CVar.SERVERONLY);
+
+ ///
+ /// Whether to load the preset development CVars.
+ /// This disables some things like lobby to make development easier.
+ /// Even when true, these are only loaded if the game is compiled with DEVELOPMENT set.
+ ///
+ public static readonly CVarDef ConfigPresetDevelopment =
+ CVarDef.Create("config.preset_development", true, CVar.SERVERONLY);
+
+ ///
+ /// Whether to load the preset debug CVars.
+ /// Even when true, these are only loaded if the game is compiled with DEBUG set.
+ ///
+ public static readonly CVarDef ConfigPresetDebug =
+ CVarDef.Create("config.preset_debug", true, CVar.SERVERONLY);
+}
diff --git a/Content.Shared/CCVar/CCVars.Console.cs b/Content.Shared/CCVar/CCVars.Console.cs
new file mode 100644
index 00000000000000..e670b9f836ec57
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Console.cs
@@ -0,0 +1,15 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ public static readonly CVarDef ConsoleLoginLocal =
+ CVarDef.Create("console.loginlocal", true, CVar.ARCHIVE | CVar.SERVERONLY);
+
+ ///
+ /// Automatically log in the given user as host, equivalent to the promotehost command.
+ ///
+ public static readonly CVarDef ConsoleLoginHostUser =
+ CVarDef.Create("console.login_host_user", "", CVar.ARCHIVE | CVar.SERVERONLY);
+}
diff --git a/Content.Shared/CCVar/CCVars.Crewmanifest.cs b/Content.Shared/CCVar/CCVars.Crewmanifest.cs
new file mode 100644
index 00000000000000..d6251886b9504a
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Crewmanifest.cs
@@ -0,0 +1,24 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ ///
+ /// Setting this allows a crew manifest to be opened from any window
+ /// that has a crew manifest button, and sends the correct message.
+ /// If this is false, only in-game entities will allow you to see
+ /// the crew manifest, if the functionality is coded in.
+ /// Having administrator priveledge ignores this, but will still
+ /// hide the button in UI windows.
+ ///
+ public static readonly CVarDef CrewManifestWithoutEntity =
+ CVarDef.Create("crewmanifest.no_entity", true, CVar.REPLICATED);
+
+ ///
+ /// Setting this allows the crew manifest to be viewed from 'unsecure'
+ /// entities, such as the PDA.
+ ///
+ public static readonly CVarDef CrewManifestUnsecure =
+ CVarDef.Create("crewmanifest.unsecure", true, CVar.REPLICATED);
+}
diff --git a/Content.Shared/CCVar/CCVars.Database.cs b/Content.Shared/CCVar/CCVars.Database.cs
new file mode 100644
index 00000000000000..c549bd7e033ac4
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Database.cs
@@ -0,0 +1,77 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+#if DEBUG
+ private const int DefaultSqliteDelay = 1;
+#else
+ private const int DefaultSqliteDelay = 0;
+#endif
+
+ public static readonly CVarDef DatabaseEngine =
+ CVarDef.Create("database.engine", "sqlite", CVar.SERVERONLY);
+
+ public static readonly CVarDef DatabaseSqliteDbPath =
+ CVarDef.Create("database.sqlite_dbpath", "preferences.db", CVar.SERVERONLY);
+
+ ///
+ /// Milliseconds to asynchronously delay all SQLite database acquisitions with.
+ ///
+ ///
+ /// Defaults to 1 on DEBUG, 0 on RELEASE.
+ /// This is intended to help catch .Result deadlock bugs that only happen on postgres
+ /// (because SQLite is not actually asynchronous normally)
+ ///
+ public static readonly CVarDef DatabaseSqliteDelay =
+ CVarDef.Create("database.sqlite_delay", DefaultSqliteDelay, CVar.SERVERONLY);
+
+ ///
+ /// Amount of concurrent SQLite database operations.
+ ///
+ ///
+ /// Note that SQLite is not a properly asynchronous database and also has limited read/write concurrency.
+ /// Increasing this number may allow more concurrent reads, but it probably won't matter much.
+ /// SQLite operations are normally ran on the thread pool, which may cause thread pool starvation if the concurrency is too high.
+ ///
+ public static readonly CVarDef DatabaseSqliteConcurrency =
+ CVarDef.Create("database.sqlite_concurrency", 3, CVar.SERVERONLY);
+
+ public static readonly CVarDef DatabasePgHost =
+ CVarDef.Create("database.pg_host", "localhost", CVar.SERVERONLY);
+
+ public static readonly CVarDef DatabasePgPort =
+ CVarDef.Create("database.pg_port", 5432, CVar.SERVERONLY);
+
+ public static readonly CVarDef DatabasePgDatabase =
+ CVarDef.Create("database.pg_database", "ss14", CVar.SERVERONLY);
+
+ public static readonly CVarDef DatabasePgUsername =
+ CVarDef.Create("database.pg_username", "postgres", CVar.SERVERONLY);
+
+ public static readonly CVarDef DatabasePgPassword =
+ CVarDef.Create("database.pg_password", "", CVar.SERVERONLY | CVar.CONFIDENTIAL);
+
+ ///
+ /// Max amount of concurrent Postgres database operations.
+ ///
+ public static readonly CVarDef DatabasePgConcurrency =
+ CVarDef.Create("database.pg_concurrency", 8, CVar.SERVERONLY);
+
+ ///
+ /// Milliseconds to asynchronously delay all PostgreSQL database operations with.
+ ///
+ ///
+ /// This is intended for performance testing. It works different from ,
+ /// as the lag is applied after acquiring the database lock.
+ ///
+ public static readonly CVarDef DatabasePgFakeLag =
+ CVarDef.Create("database.pg_fake_lag", 0, CVar.SERVERONLY);
+
+ ///
+ /// Basically only exists for integration tests to avoid race conditions.
+ ///
+ public static readonly CVarDef DatabaseSynchronous =
+ CVarDef.Create("database.sync", false, CVar.SERVERONLY);
+}
diff --git a/Content.Shared/CCVar/CCVars.Discord.cs b/Content.Shared/CCVar/CCVars.Discord.cs
new file mode 100644
index 00000000000000..a6c4ada7454119
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Discord.cs
@@ -0,0 +1,61 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ ///
+ /// The role that will get mentioned if a new SOS ahelp comes in.
+ ///
+ public static readonly CVarDef DiscordAhelpMention =
+ CVarDef.Create("discord.on_call_ping", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL);
+
+ ///
+ /// URL of the discord webhook to relay unanswered ahelp messages.
+ ///
+ public static readonly CVarDef DiscordOnCallWebhook =
+ CVarDef.Create("discord.on_call_webhook", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL);
+
+ ///
+ /// URL of the Discord webhook which will relay all ahelp messages.
+ ///
+ public static readonly CVarDef DiscordAHelpWebhook =
+ CVarDef.Create("discord.ahelp_webhook", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL);
+
+ ///
+ /// The server icon to use in the Discord ahelp embed footer.
+ /// Valid values are specified at https://discord.com/developers/docs/resources/channel#embed-object-embed-footer-structure.
+ ///
+ public static readonly CVarDef DiscordAHelpFooterIcon =
+ CVarDef.Create("discord.ahelp_footer_icon", string.Empty, CVar.SERVERONLY);
+
+ ///
+ /// The avatar to use for the webhook. Should be an URL.
+ ///
+ public static readonly CVarDef DiscordAHelpAvatar =
+ CVarDef.Create("discord.ahelp_avatar", string.Empty, CVar.SERVERONLY);
+
+ ///
+ /// URL of the Discord webhook which will relay all custom votes. If left empty, disables the webhook.
+ ///
+ public static readonly CVarDef DiscordVoteWebhook =
+ CVarDef.Create("discord.vote_webhook", string.Empty, CVar.SERVERONLY);
+
+ ///
+ /// URL of the Discord webhook which will relay all votekick votes. If left empty, disables the webhook.
+ ///
+ public static readonly CVarDef DiscordVotekickWebhook =
+ CVarDef.Create("discord.votekick_webhook", string.Empty, CVar.SERVERONLY);
+
+ ///
+ /// URL of the Discord webhook which will relay round restart messages.
+ ///
+ public static readonly CVarDef DiscordRoundUpdateWebhook =
+ CVarDef.Create("discord.round_update_webhook", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL);
+
+ ///
+ /// Role id for the Discord webhook to ping when the round ends.
+ ///
+ public static readonly CVarDef DiscordRoundEndRoleWebhook =
+ CVarDef.Create("discord.round_end_role", string.Empty, CVar.SERVERONLY);
+}
diff --git a/Content.Shared/CCVar/CCVars.Events.cs b/Content.Shared/CCVar/CCVars.Events.cs
new file mode 100644
index 00000000000000..48797b8438cf5f
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Events.cs
@@ -0,0 +1,12 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ ///
+ /// Controls if the game should run station events
+ ///
+ public static readonly CVarDef
+ EventsEnabled = CVarDef.Create("events.enabled", true, CVar.ARCHIVE | CVar.SERVERONLY);
+}
diff --git a/Content.Shared/CCVar/CCVars.Explosion.cs b/Content.Shared/CCVar/CCVars.Explosion.cs
new file mode 100644
index 00000000000000..51d93456b7e6c7
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Explosion.cs
@@ -0,0 +1,108 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ ///
+ /// How many tiles the explosion system will process per tick
+ ///
+ ///
+ /// Setting this too high will put a large load on a single tick. Setting this too low will lead to
+ /// unnaturally "slow" explosions.
+ ///
+ public static readonly CVarDef ExplosionTilesPerTick =
+ CVarDef.Create("explosion.tiles_per_tick", 100, CVar.SERVERONLY);
+
+ ///
+ /// Upper limit on the size of an explosion before physics-throwing is disabled.
+ ///
+ ///
+ /// Large nukes tend to generate a lot of shrapnel that flies through space. This can functionally cripple
+ /// the server TPS for a while after an explosion (or even during, if the explosion is processed
+ /// incrementally.
+ ///
+ public static readonly CVarDef ExplosionThrowLimit =
+ CVarDef.Create("explosion.throw_limit", 400, CVar.SERVERONLY);
+
+ ///
+ /// If this is true, explosion processing will pause the NodeGroupSystem to pause updating.
+ ///
+ ///
+ /// This only takes effect if an explosion needs more than one tick to process (i.e., covers more than tiles). If this is not enabled, the node-system will rebuild its graph
+ /// every tick as the explosion shreds the station, causing significant slowdown.
+ ///
+ public static readonly CVarDef ExplosionSleepNodeSys =
+ CVarDef.Create("explosion.node_sleep", true, CVar.SERVERONLY);
+
+ ///
+ /// Upper limit on the total area that an explosion can affect before the neighbor-finding algorithm just
+ /// stops. Defaults to a 60-rile radius explosion.
+ ///
+ ///
+ /// Actual area may be larger, as it currently doesn't terminate mid neighbor finding. I.e., area may be that of a ~51 tile radius circle instead.
+ ///
+ public static readonly CVarDef ExplosionMaxArea =
+ CVarDef.Create("explosion.max_area", (int)3.14f * 256 * 256, CVar.SERVERONLY);
+
+ ///
+ /// Upper limit on the number of neighbor finding steps for the explosion system neighbor-finding algorithm.
+ ///
+ ///
+ /// Effectively places an upper limit on the range that any explosion can have. In the vast majority of
+ /// instances, will likely be hit before this becomes a limiting factor.
+ ///
+ public static readonly CVarDef ExplosionMaxIterations =
+ CVarDef.Create("explosion.max_iterations", 500, CVar.SERVERONLY);
+
+ ///
+ /// Max Time in milliseconds to spend processing explosions every tick.
+ ///
+ ///
+ /// This time limiting is not perfectly implemented. Firstly, a significant chunk of processing time happens
+ /// due to queued entity deletions, which happen outside of the system update code. Secondly, explosion
+ /// spawning cannot currently be interrupted & resumed, and may lead to exceeding this time limit.
+ ///
+ public static readonly CVarDef ExplosionMaxProcessingTime =
+ CVarDef.Create("explosion.max_tick_time", 7f, CVar.SERVERONLY);
+
+ ///
+ /// If the explosion is being processed incrementally over several ticks, this variable determines whether
+ /// updating the grid tiles should be done incrementally at the end of every tick, or only once the explosion has finished processing.
+ ///
+ ///
+ /// The most notable consequence of this change is that explosions will only punch a hole in the station &
+ /// create a vacumm once they have finished exploding. So airlocks will no longer slam shut as the explosion
+ /// expands, just suddenly at the end.
+ ///
+ public static readonly CVarDef ExplosionIncrementalTileBreaking =
+ CVarDef.Create("explosion.incremental_tile", false, CVar.SERVERONLY);
+
+ ///
+ /// This determines for how many seconds an explosion should stay visible once it has finished expanding.
+ ///
+ public static readonly CVarDef ExplosionPersistence =
+ CVarDef.Create("explosion.persistence", 1.0f, CVar.SERVERONLY);
+
+ ///
+ /// If an explosion covers a larger area than this number, the damaging/processing will always start during
+ /// the next tick, instead of during the same tick that the explosion was generated in.
+ ///
+ ///
+ /// This value can be used to ensure that for large explosions the area/tile calculation and the explosion
+ /// processing/damaging occurs in separate ticks. This helps reduce the single-tick lag if both and are large. I.e., instead of
+ /// a single tick explosion, this cvar allows for a configuration that results in a two-tick explosion,
+ /// though most of the computational cost is still in the second tick.
+ ///
+ public static readonly CVarDef ExplosionSingleTickAreaLimit =
+ CVarDef.Create("explosion.single_tick_area_limit", 400, CVar.SERVERONLY);
+
+ ///
+ /// Whether or not explosions are allowed to create tiles that have
+ /// set to true.
+ ///
+ public static readonly CVarDef ExplosionCanCreateVacuum =
+ CVarDef.Create("explosion.can_create_vacuum", true, CVar.SERVERONLY);
+}
diff --git a/Content.Shared/CCVar/CCVars.Game.Infolinks.cs b/Content.Shared/CCVar/CCVars.Game.Infolinks.cs
new file mode 100644
index 00000000000000..fa8332b497efca
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Game.Infolinks.cs
@@ -0,0 +1,54 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ ///
+ /// Link to Discord server to show in the launcher.
+ ///
+ public static readonly CVarDef InfoLinksDiscord =
+ CVarDef.Create("infolinks.discord", "", CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// Link to website to show in the launcher.
+ ///
+ public static readonly CVarDef InfoLinksForum =
+ CVarDef.Create("infolinks.forum", "", CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// Link to GitHub page to show in the launcher.
+ ///
+ public static readonly CVarDef InfoLinksGithub =
+ CVarDef.Create("infolinks.github", "", CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// Link to website to show in the launcher.
+ ///
+ public static readonly CVarDef InfoLinksWebsite =
+ CVarDef.Create("infolinks.website", "", CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// Link to wiki to show in the launcher.
+ ///
+ public static readonly CVarDef InfoLinksWiki =
+ CVarDef.Create("infolinks.wiki", "", CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// Link to Patreon. Not shown in the launcher currently.
+ ///
+ public static readonly CVarDef InfoLinksPatreon =
+ CVarDef.Create("infolinks.patreon", "", CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// Link to the bug report form.
+ ///
+ public static readonly CVarDef InfoLinksBugReport =
+ CVarDef.Create("infolinks.bug_report", "", CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// Link to site handling ban appeals. Shown in ban disconnect messages.
+ ///
+ public static readonly CVarDef InfoLinksAppeal =
+ CVarDef.Create("infolinks.appeal", "", CVar.SERVER | CVar.REPLICATED);
+}
diff --git a/Content.Shared/CCVar/CCVars.Game.cs b/Content.Shared/CCVar/CCVars.Game.cs
new file mode 100644
index 00000000000000..19092055e39f46
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Game.cs
@@ -0,0 +1,336 @@
+using Content.Shared.Roles;
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ ///
+ /// Disables most functionality in the GameTicker.
+ ///
+ public static readonly CVarDef
+ GameDummyTicker = CVarDef.Create("game.dummyticker", false, CVar.ARCHIVE | CVar.SERVERONLY);
+
+ ///
+ /// Controls if the lobby is enabled. If it is not, and there are no available jobs, you may get stuck on a black screen.
+ ///
+ public static readonly CVarDef
+ GameLobbyEnabled = CVarDef.Create("game.lobbyenabled", true, CVar.ARCHIVE);
+
+ ///
+ /// Controls the duration of the lobby timer in seconds. Defaults to 2 minutes and 30 seconds.
+ ///
+ public static readonly CVarDef
+ GameLobbyDuration = CVarDef.Create("game.lobbyduration", 150, CVar.ARCHIVE);
+
+ ///
+ /// Controls if players can latejoin at all.
+ ///
+ public static readonly CVarDef
+ GameDisallowLateJoins = CVarDef.Create("game.disallowlatejoins", false, CVar.ARCHIVE | CVar.SERVERONLY);
+
+ ///
+ /// Controls the default game preset.
+ ///
+ public static readonly CVarDef
+ GameLobbyDefaultPreset = CVarDef.Create("game.defaultpreset", "secret", CVar.ARCHIVE);
+
+ ///
+ /// Controls if the game can force a different preset if the current preset's criteria are not met.
+ ///
+ public static readonly CVarDef
+ GameLobbyFallbackEnabled = CVarDef.Create("game.fallbackenabled", true, CVar.ARCHIVE);
+
+ ///
+ /// The preset for the game to fall back to if the selected preset could not be used, and fallback is enabled.
+ ///
+ public static readonly CVarDef
+ GameLobbyFallbackPreset = CVarDef.Create("game.fallbackpreset", "Traitor,Extended", CVar.ARCHIVE);
+
+ ///
+ /// Controls if people can win the game in Suspicion or Deathmatch.
+ ///
+ public static readonly CVarDef
+ GameLobbyEnableWin = CVarDef.Create("game.enablewin", true, CVar.ARCHIVE);
+
+ ///
+ /// Controls the maximum number of character slots a player is allowed to have.
+ ///
+ public static readonly CVarDef
+ GameMaxCharacterSlots = CVarDef.Create("game.maxcharacterslots", 30, CVar.ARCHIVE | CVar.SERVERONLY);
+
+ ///
+ /// Controls the game map prototype to load. SS14 stores these prototypes in Prototypes/Maps.
+ ///
+ public static readonly CVarDef
+ GameMap = CVarDef.Create("game.map", string.Empty, CVar.SERVERONLY);
+
+ ///
+ /// Controls whether to use world persistence or not.
+ ///
+ public static readonly CVarDef
+ UsePersistence = CVarDef.Create("game.usepersistence", false, CVar.ARCHIVE);
+
+ ///
+ /// If world persistence is used, what map prototype should be initially loaded.
+ /// If the save file exists, it replaces MapPath but everything else stays the same (station name and such).
+ ///
+ public static readonly CVarDef
+ PersistenceMap = CVarDef.Create("game.persistencemap", "Empty", CVar.ARCHIVE);
+
+ ///
+ /// Prototype to use for map pool.
+ ///
+ public static readonly CVarDef
+ GameMapPool = CVarDef.Create("game.map_pool", "DefaultMapPool", CVar.SERVERONLY);
+
+ ///
+ /// The depth of the queue used to calculate which map is next in rotation.
+ /// This is how long the game "remembers" that some map was put in play. Default is 16 rounds.
+ ///
+ public static readonly CVarDef
+ GameMapMemoryDepth = CVarDef.Create("game.map_memory_depth", 16, CVar.SERVERONLY);
+
+ ///
+ /// Is map rotation enabled?
+ ///
+ public static readonly CVarDef
+ GameMapRotation = CVarDef.Create("game.map_rotation", true, CVar.SERVERONLY);
+
+ ///
+ /// If roles should be restricted based on time.
+ ///
+ public static readonly CVarDef
+ GameRoleTimers = CVarDef.Create("game.role_timers", true, CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// Override default role requirements using a
+ ///
+ public static readonly CVarDef
+ GameRoleTimerOverride = CVarDef.Create("game.role_timer_override", "", CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// If roles should be restricted based on whether or not they are whitelisted.
+ ///
+ public static readonly CVarDef
+ GameRoleWhitelist = CVarDef.Create("game.role_whitelist", true, CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// Whether or not disconnecting inside of a cryopod should remove the character or just store them until they reconnect.
+ ///
+ public static readonly CVarDef
+ GameCryoSleepRejoining = CVarDef.Create("game.cryo_sleep_rejoining", false, CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// When enabled, guests will be assigned permanent UIDs and will have their preferences stored.
+ ///
+ public static readonly CVarDef GamePersistGuests =
+ CVarDef.Create("game.persistguests", true, CVar.ARCHIVE | CVar.SERVERONLY);
+
+ public static readonly CVarDef GameDiagonalMovement =
+ CVarDef.Create("game.diagonalmovement", true, CVar.ARCHIVE);
+
+ public static readonly CVarDef SoftMaxPlayers =
+ CVarDef.Create("game.soft_max_players", 30, CVar.SERVERONLY | CVar.ARCHIVE);
+
+ ///
+ /// If a player gets denied connection to the server,
+ /// how long they are forced to wait before attempting to reconnect.
+ ///
+ public static readonly CVarDef GameServerFullReconnectDelay =
+ CVarDef.Create("game.server_full_reconnect_delay", 30, CVar.SERVERONLY);
+
+ ///
+ /// Whether or not panic bunker is currently enabled.
+ ///
+ public static readonly CVarDef PanicBunkerEnabled =
+ CVarDef.Create("game.panic_bunker.enabled", false, CVar.NOTIFY | CVar.REPLICATED | CVar.SERVER);
+
+ ///
+ /// Whether or not the panic bunker will disable when an admin comes online.
+ ///
+ public static readonly CVarDef PanicBunkerDisableWithAdmins =
+ CVarDef.Create("game.panic_bunker.disable_with_admins", false, CVar.SERVERONLY);
+
+ ///
+ /// Whether or not the panic bunker will enable when no admins are online.
+ ///
+ public static readonly CVarDef PanicBunkerEnableWithoutAdmins =
+ CVarDef.Create("game.panic_bunker.enable_without_admins", false, CVar.SERVERONLY);
+
+ ///
+ /// Whether or not the panic bunker will count deadminned admins for
+ /// and
+ ///
+ ///
+ public static readonly CVarDef PanicBunkerCountDeadminnedAdmins =
+ CVarDef.Create("game.panic_bunker.count_deadminned_admins", false, CVar.SERVERONLY);
+
+ ///
+ /// Show reason of disconnect for user or not.
+ ///
+ public static readonly CVarDef PanicBunkerShowReason =
+ CVarDef.Create("game.panic_bunker.show_reason", false, CVar.SERVERONLY);
+
+ ///
+ /// Minimum age of the account (from server's PoV, so from first-seen date) in minutes.
+ ///
+ public static readonly CVarDef PanicBunkerMinAccountAge =
+ CVarDef.Create("game.panic_bunker.min_account_age", 1440, CVar.SERVERONLY);
+
+ ///
+ /// Minimal overall played time.
+ ///
+ public static readonly CVarDef PanicBunkerMinOverallMinutes =
+ CVarDef.Create("game.panic_bunker.min_overall_minutes", 600, CVar.SERVERONLY);
+
+ ///
+ /// A custom message that will be used for connections denied to the panic bunker
+ /// If not empty, then will overwrite
+ ///
+ public static readonly CVarDef PanicBunkerCustomReason =
+ CVarDef.Create("game.panic_bunker.custom_reason", string.Empty, CVar.SERVERONLY);
+
+ ///
+ /// Allow bypassing the panic bunker if the user is whitelisted.
+ ///
+ public static readonly CVarDef BypassBunkerWhitelist =
+ CVarDef.Create("game.panic_bunker.whitelisted_can_bypass", true, CVar.SERVERONLY);
+
+ /*
+ * TODO: Remove baby jail code once a more mature gateway process is established. This code is only being issued as a stopgap to help with potential tiding in the immediate future.
+ */
+
+ ///
+ /// Whether the baby jail is currently enabled.
+ ///
+ public static readonly CVarDef BabyJailEnabled =
+ CVarDef.Create("game.baby_jail.enabled", false, CVar.NOTIFY | CVar.REPLICATED | CVar.SERVER);
+
+ ///
+ /// Show reason of disconnect for user or not.
+ ///
+ public static readonly CVarDef BabyJailShowReason =
+ CVarDef.Create("game.baby_jail.show_reason", false, CVar.SERVERONLY);
+
+ ///
+ /// Maximum age of the account (from server's PoV, so from first-seen date) in minutes that can access baby
+ /// jailed servers.
+ ///
+ public static readonly CVarDef BabyJailMaxAccountAge =
+ CVarDef.Create("game.baby_jail.max_account_age", 1440, CVar.SERVERONLY);
+
+ ///
+ /// Maximum overall played time allowed to access baby jailed servers.
+ ///
+ public static readonly CVarDef BabyJailMaxOverallMinutes =
+ CVarDef.Create("game.baby_jail.max_overall_minutes", 120, CVar.SERVERONLY);
+
+ ///
+ /// A custom message that will be used for connections denied due to the baby jail.
+ /// If not empty, then will overwrite
+ ///
+ public static readonly CVarDef BabyJailCustomReason =
+ CVarDef.Create("game.baby_jail.custom_reason", string.Empty, CVar.SERVERONLY);
+
+ ///
+ /// Allow bypassing the baby jail if the user is whitelisted.
+ ///
+ public static readonly CVarDef BypassBabyJailWhitelist =
+ CVarDef.Create("game.baby_jail.whitelisted_can_bypass", true, CVar.SERVERONLY);
+
+ ///
+ /// Make people bonk when trying to climb certain objects like tables.
+ ///
+ public static readonly CVarDef GameTableBonk =
+ CVarDef.Create("game.table_bonk", false, CVar.REPLICATED);
+
+ ///
+ /// Whether or not status icons are rendered for everyone.
+ ///
+ public static readonly CVarDef GlobalStatusIconsEnabled =
+ CVarDef.Create("game.global_status_icons_enabled", true, CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// Whether or not status icons are rendered on this specific client.
+ ///
+ public static readonly CVarDef LocalStatusIconsEnabled =
+ CVarDef.Create("game.local_status_icons_enabled", true, CVar.CLIENTONLY);
+
+ ///
+ /// Whether or not coordinates on the Debug overlay should only be available to admins.
+ ///
+ public static readonly CVarDef DebugCoordinatesAdminOnly =
+ CVarDef.Create("game.debug_coordinates_admin_only", true, CVar.SERVER | CVar.REPLICATED);
+
+#if EXCEPTION_TOLERANCE
+ ///
+ /// Amount of times round start must fail before the server is shut down.
+ /// Set to 0 or a negative number to disable.
+ ///
+ public static readonly CVarDef RoundStartFailShutdownCount =
+ CVarDef.Create("game.round_start_fail_shutdown_count", 5, CVar.SERVERONLY | CVar.SERVER);
+#endif
+
+ ///
+ /// Delay between station alert level changes.
+ ///
+ public static readonly CVarDef GameAlertLevelChangeDelay =
+ CVarDef.Create("game.alert_level_change_delay", 30, CVar.SERVERONLY);
+
+ ///
+ /// The time in seconds that the server should wait before restarting the round.
+ /// Defaults to 2 minutes.
+ ///
+ public static readonly CVarDef RoundRestartTime =
+ CVarDef.Create("game.round_restart_time", 120f, CVar.SERVERONLY);
+
+ ///
+ /// The prototype to use for secret weights.
+ ///
+ public static readonly CVarDef SecretWeightPrototype =
+ CVarDef.Create("game.secret_weight_prototype", "Secret", CVar.SERVERONLY);
+
+ ///
+ /// The id of the sound collection to randomly choose a sound from and play when the round ends.
+ ///
+ public static readonly CVarDef RoundEndSoundCollection =
+ CVarDef.Create("game.round_end_sound_collection", "RoundEnd", CVar.SERVERONLY);
+
+ ///
+ /// Whether or not to add every player as a global override to PVS at round end.
+ /// This will allow all players to see their clothing in the round screen player list screen,
+ /// but may cause lag during round end with very high player counts.
+ ///
+ public static readonly CVarDef RoundEndPVSOverrides =
+ CVarDef.Create("game.round_end_pvs_overrides", true, CVar.SERVERONLY);
+
+ ///
+ /// If true, players can place objects onto tabletop games like chess boards.
+ ///
+ ///
+ /// This feature is currently highly abusable and can easily be used to crash the server,
+ /// so it's off by default.
+ ///
+ public static readonly CVarDef GameTabletopPlace =
+ CVarDef.Create("game.tabletop_place", false, CVar.SERVERONLY);
+
+ ///
+ /// If true, contraband severity can be viewed in the examine menu
+ ///
+ public static readonly CVarDef ContrabandExamine =
+ CVarDef.Create("game.contraband_examine", true, CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// Size of the lookup area for adding entities to the context menu
+ ///
+ public static readonly CVarDef GameEntityMenuLookup =
+ CVarDef.Create("game.entity_menu_lookup", 0.25f, CVar.CLIENTONLY | CVar.ARCHIVE);
+
+ ///
+ /// Should the clients window show the server hostname in the title?
+ ///
+ public static readonly CVarDef GameHostnameInTitlebar =
+ CVarDef.Create("game.hostname_in_titlebar", true, CVar.SERVER | CVar.REPLICATED);
+
+}
diff --git a/Content.Shared/CCVar/CCVars.Ghost.cs b/Content.Shared/CCVar/CCVars.Ghost.cs
new file mode 100644
index 00000000000000..39e7a3c4910ae0
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Ghost.cs
@@ -0,0 +1,24 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ ///
+ /// The time you must spend reading the rules, before the "Request" button is enabled
+ ///
+ public static readonly CVarDef GhostRoleTime =
+ CVarDef.Create("ghost.role_time", 3f, CVar.REPLICATED | CVar.SERVER);
+
+ ///
+ /// If ghost role lotteries should be made near-instanteous.
+ ///
+ public static readonly CVarDef GhostQuickLottery =
+ CVarDef.Create("ghost.quick_lottery", false, CVar.SERVERONLY);
+
+ ///
+ /// Whether or not to kill the player's mob on ghosting, when it is in a critical health state.
+ ///
+ public static readonly CVarDef GhostKillCrit =
+ CVarDef.Create("ghost.kill_crit", true, CVar.REPLICATED | CVar.SERVER);
+}
diff --git a/Content.Shared/CCVar/CCVars.Hud.cs b/Content.Shared/CCVar/CCVars.Hud.cs
new file mode 100644
index 00000000000000..f96924b34964d5
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Hud.cs
@@ -0,0 +1,24 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ public static readonly CVarDef HudTheme =
+ CVarDef.Create("hud.theme", 0, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+ public static readonly CVarDef HudHeldItemShow =
+ CVarDef.Create("hud.held_item_show", true, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+ public static readonly CVarDef CombatModeIndicatorsPointShow =
+ CVarDef.Create("hud.combat_mode_indicators_point_show", true, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+ public static readonly CVarDef LoocAboveHeadShow =
+ CVarDef.Create("hud.show_looc_above_head", true, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+ public static readonly CVarDef HudHeldItemOffset =
+ CVarDef.Create("hud.held_item_offset", 28f, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+ public static readonly CVarDef HudFpsCounterVisible =
+ CVarDef.Create("hud.fps_counter_visible", false, CVar.CLIENTONLY | CVar.ARCHIVE);
+}
diff --git a/Content.Shared/CCVar/CCVars.Ic.cs b/Content.Shared/CCVar/CCVars.Ic.cs
new file mode 100644
index 00000000000000..e149e9f3e1edd2
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Ic.cs
@@ -0,0 +1,48 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ ///
+ /// Restricts IC character names to alphanumeric chars.
+ ///
+ public static readonly CVarDef RestrictedNames =
+ CVarDef.Create("ic.restricted_names", true, CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// Allows flavor text (character descriptions)
+ ///
+ public static readonly CVarDef FlavorText =
+ CVarDef.Create("ic.flavor_text", false, CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// Adds a period at the end of a sentence if the sentence ends in a letter.
+ ///
+ public static readonly CVarDef ChatPunctuation =
+ CVarDef.Create("ic.punctuation", false, CVar.SERVER);
+
+ ///
+ /// Enables automatically forcing IC name rules. Uppercases the first letter of the first and last words of the name
+ ///
+ public static readonly CVarDef ICNameCase =
+ CVarDef.Create("ic.name_case", true, CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// Whether or not players' characters are randomly generated rather than using their selected characters in the creator.
+ ///
+ public static readonly CVarDef ICRandomCharacters =
+ CVarDef.Create("ic.random_characters", false, CVar.SERVER);
+
+ ///
+ /// A weighted random prototype used to determine the species selected for random characters.
+ ///
+ public static readonly CVarDef ICRandomSpeciesWeights =
+ CVarDef.Create("ic.random_species_weights", "SpeciesWeights", CVar.SERVER);
+
+ ///
+ /// Control displaying SSD indicators near players
+ ///
+ public static readonly CVarDef ICShowSSDIndicator =
+ CVarDef.Create("ic.show_ssd_indicator", true, CVar.CLIENTONLY);
+}
diff --git a/Content.Shared/CCVar/CCVars.Interactions.cs b/Content.Shared/CCVar/CCVars.Interactions.cs
new file mode 100644
index 00000000000000..c62f81be0ca38f
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Interactions.cs
@@ -0,0 +1,54 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ ///
+ /// Deadzone for drag-drop interactions.
+ ///
+ public static readonly CVarDef DragDropDeadZone =
+ CVarDef.Create("control.drag_dead_zone", 12f, CVar.CLIENTONLY | CVar.ARCHIVE);
+
+ ///
+ /// Toggles whether the walking key is a toggle or a held key.
+ ///
+ public static readonly CVarDef ToggleWalk =
+ CVarDef.Create("control.toggle_walk", false, CVar.CLIENTONLY | CVar.ARCHIVE);
+
+ // The rationale behind the default limit is simply that I can easily get to 7 interactions per second by just
+ // trying to spam toggle a light switch or lever (though the UseDelay component limits the actual effect of the
+ // interaction). I don't want to accidentally spam admins with alerts just because somebody is spamming a
+ // key manually, nor do we want to alert them just because the player is having network issues and the server
+ // receives multiple interactions at once. But we also want to try catch people with modified clients that spam
+ // many interactions on the same tick. Hence, a very short period, with a relatively high count.
+
+ ///
+ /// Maximum number of interactions that a player can perform within seconds
+ ///
+ public static readonly CVarDef InteractionRateLimitCount =
+ CVarDef.Create("interaction.rate_limit_count", 5, CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ public static readonly CVarDef InteractionRateLimitPeriod =
+ CVarDef.Create("interaction.rate_limit_period", 0.5f, CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// Minimum delay (in seconds) between notifying admins about interaction rate limit violations. A negative
+ /// value disables admin announcements.
+ ///
+ public static readonly CVarDef InteractionRateLimitAnnounceAdminsDelay =
+ CVarDef.Create("interaction.rate_limit_announce_admins_delay", 120, CVar.SERVERONLY);
+
+ ///
+ /// Whether or not the storage UI is static and bound to the hotbar, or unbound and allowed to be dragged anywhere.
+ ///
+ public static readonly CVarDef StaticStorageUI =
+ CVarDef.Create("control.static_storage_ui", true, CVar.CLIENTONLY | CVar.ARCHIVE);
+
+ ///
+ /// Whether or not the storage window uses a transparent or opaque sprite.
+ ///
+ public static readonly CVarDef OpaqueStorageWindow =
+ CVarDef.Create("control.opaque_storage_background", false, CVar.CLIENTONLY | CVar.ARCHIVE);
+}
diff --git a/Content.Shared/CCVar/CCVars.Interface.cs b/Content.Shared/CCVar/CCVars.Interface.cs
new file mode 100644
index 00000000000000..79a28e6b4e6a74
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Interface.cs
@@ -0,0 +1,24 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ public static readonly CVarDef UIClickSound =
+ CVarDef.Create("interface.click_sound", "/Audio/UserInterface/click.ogg", CVar.REPLICATED);
+
+ public static readonly CVarDef UIHoverSound =
+ CVarDef.Create("interface.hover_sound", "/Audio/UserInterface/hover.ogg", CVar.REPLICATED);
+
+ public static readonly CVarDef UILayout =
+ CVarDef.Create("ui.layout", "Default", CVar.CLIENTONLY | CVar.ARCHIVE);
+
+ public static readonly CVarDef DefaultScreenChatSize =
+ CVarDef.Create("ui.default_chat_size", "", CVar.CLIENTONLY | CVar.ARCHIVE);
+
+ public static readonly CVarDef SeparatedScreenChatSize =
+ CVarDef.Create("ui.separated_chat_size", "0.6,0", CVar.CLIENTONLY | CVar.ARCHIVE);
+
+ public static readonly CVarDef OutlineEnabled =
+ CVarDef.Create("outline.enabled", true, CVar.CLIENTONLY);
+}
diff --git a/Content.Shared/CCVar/CCVars.Mapping.cs b/Content.Shared/CCVar/CCVars.Mapping.cs
new file mode 100644
index 00000000000000..06cd2870ba24ce
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Mapping.cs
@@ -0,0 +1,24 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ ///
+ /// Will mapping mode enable autosaves when it's activated?
+ ///
+ public static readonly CVarDef
+ AutosaveEnabled = CVarDef.Create("mapping.autosave", true, CVar.SERVERONLY);
+
+ ///
+ /// Autosave interval in seconds.
+ ///
+ public static readonly CVarDef
+ AutosaveInterval = CVarDef.Create("mapping.autosave_interval", 600f, CVar.SERVERONLY);
+
+ ///
+ /// Directory in server user data to save to. Saves will be inside folders in this directory.
+ ///
+ public static readonly CVarDef
+ AutosaveDirectory = CVarDef.Create("mapping.autosave_dir", "Autosaves", CVar.SERVERONLY);
+}
diff --git a/Content.Shared/CCVar/CCVars.Midi.cs b/Content.Shared/CCVar/CCVars.Midi.cs
new file mode 100644
index 00000000000000..4ca4bfd6f8647b
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Midi.cs
@@ -0,0 +1,18 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ public static readonly CVarDef MaxMidiEventsPerSecond =
+ CVarDef.Create("midi.max_events_per_second", 1000, CVar.REPLICATED | CVar.SERVER);
+
+ public static readonly CVarDef MaxMidiEventsPerBatch =
+ CVarDef.Create("midi.max_events_per_batch", 60, CVar.REPLICATED | CVar.SERVER);
+
+ public static readonly CVarDef MaxMidiBatchesDropped =
+ CVarDef.Create("midi.max_batches_dropped", 1, CVar.SERVERONLY);
+
+ public static readonly CVarDef MaxMidiLaggedBatches =
+ CVarDef.Create("midi.max_lagged_batches", 8, CVar.SERVERONLY);
+}
diff --git a/Content.Shared/CCVar/CCVars.Misc.cs b/Content.Shared/CCVar/CCVars.Misc.cs
new file mode 100644
index 00000000000000..3d597c742746a2
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Misc.cs
@@ -0,0 +1,97 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ public static readonly CVarDef HolidaysEnabled = CVarDef.Create("holidays.enabled", true, CVar.SERVERONLY);
+ public static readonly CVarDef BrandingSteam = CVarDef.Create("branding.steam", false, CVar.CLIENTONLY);
+ public static readonly CVarDef EntityMenuGroupingType = CVarDef.Create("entity_menu", 0, CVar.CLIENTONLY);
+
+ ///
+ /// Should we pre-load all of the procgen atlasses.
+ ///
+ public static readonly CVarDef ProcgenPreload =
+ CVarDef.Create("procgen.preload", true, CVar.SERVERONLY);
+
+ ///
+ /// Enabled: Cloning has 70% cost and reclaimer will refuse to reclaim corpses with souls. (For LRP).
+ /// Disabled: Cloning has full biomass cost and reclaimer can reclaim corpses with souls. (Playtested and balanced for MRP+).
+ ///
+ public static readonly CVarDef BiomassEasyMode =
+ CVarDef.Create("biomass.easy_mode", true, CVar.SERVERONLY);
+
+ ///
+ /// A scale factor applied to a grid's bounds when trying to find a spot to randomly generate an anomaly.
+ ///
+ public static readonly CVarDef AnomalyGenerationGridBoundsScale =
+ CVarDef.Create("anomaly.generation_grid_bounds_scale", 0.6f, CVar.SERVERONLY);
+
+ ///
+ /// How long a client can go without any input before being considered AFK.
+ ///
+ public static readonly CVarDef AfkTime =
+ CVarDef.Create("afk.time", 60f, CVar.SERVERONLY);
+
+ ///
+ /// Flavor limit. This is to ensure that having a large mass of flavors in
+ /// some food object won't spam a user with flavors.
+ ///
+ public static readonly CVarDef
+ FlavorLimit = CVarDef.Create("flavor.limit", 10, CVar.SERVERONLY);
+
+ public static readonly CVarDef DestinationFile =
+ CVarDef.Create("autogen.destination_file", "", CVar.SERVER | CVar.SERVERONLY);
+
+ ///
+ /// Whether uploaded files will be stored in the server's database.
+ /// This is useful to keep "logs" on what files admins have uploaded in the past.
+ ///
+ public static readonly CVarDef ResourceUploadingStoreEnabled =
+ CVarDef.Create("netres.store_enabled", true, CVar.SERVER | CVar.SERVERONLY);
+
+ ///
+ /// Numbers of days before stored uploaded files are deleted. Set to zero or negative to disable auto-delete.
+ /// This is useful to free some space automatically. Auto-deletion runs only on server boot.
+ ///
+ public static readonly CVarDef ResourceUploadingStoreDeletionDays =
+ CVarDef.Create("netres.store_deletion_days", 30, CVar.SERVER | CVar.SERVERONLY);
+
+ ///
+ /// If a server update restart is pending, the delay after the last player leaves before we actually restart. In seconds.
+ ///
+ public static readonly CVarDef UpdateRestartDelay =
+ CVarDef.Create("update.restart_delay", 20f, CVar.SERVERONLY);
+
+ ///
+ /// If fire alarms should have all access, or if activating/resetting these
+ /// should be restricted to what is dictated on a player's access card.
+ /// Defaults to true.
+ ///
+ public static readonly CVarDef FireAlarmAllAccess =
+ CVarDef.Create("firealarm.allaccess", true, CVar.SERVERONLY);
+
+ ///
+ /// Time between play time autosaves, in seconds.
+ ///
+ public static readonly CVarDef
+ PlayTimeSaveInterval = CVarDef.Create("playtime.save_interval", 900f, CVar.SERVERONLY);
+
+ ///
+ /// The maximum amount of time the entity GC can process, in ms.
+ ///
+ public static readonly CVarDef GCMaximumTimeMs =
+ CVarDef.Create("entgc.maximum_time_ms", 5, CVar.SERVERONLY);
+
+ public static readonly CVarDef GatewayGeneratorEnabled =
+ CVarDef.Create("gateway.generator_enabled", true);
+
+ public static readonly CVarDef TippyEntity =
+ CVarDef.Create("tippy.entity", "Tippy", CVar.SERVER | CVar.REPLICATED);
+
+ ///
+ /// The number of seconds that must pass for a single entity to be able to point at something again.
+ ///
+ public static readonly CVarDef PointingCooldownSeconds =
+ CVarDef.Create("pointing.cooldown_seconds", 0.5f, CVar.SERVERONLY);
+}
diff --git a/Content.Shared/CCVar/CCVars.NPC.cs b/Content.Shared/CCVar/CCVars.NPC.cs
new file mode 100644
index 00000000000000..f0d5520195d038
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.NPC.cs
@@ -0,0 +1,16 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ public static readonly CVarDef NPCMaxUpdates =
+ CVarDef.Create("npc.max_updates", 128);
+
+ public static readonly CVarDef NPCEnabled = CVarDef.Create("npc.enabled", true);
+
+ ///
+ /// Should NPCs pathfind when steering. For debug purposes.
+ ///
+ public static readonly CVarDef NPCPathfinding = CVarDef.Create("npc.pathfinding", true);
+}
diff --git a/Content.Shared/CCVar/CCVars.Net.cs b/Content.Shared/CCVar/CCVars.Net.cs
new file mode 100644
index 00000000000000..b7465def2ebb32
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Net.cs
@@ -0,0 +1,15 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ public static readonly CVarDef NetAtmosDebugOverlayTickRate =
+ CVarDef.Create("net.atmosdbgoverlaytickrate", 3.0f);
+
+ public static readonly CVarDef NetGasOverlayTickRate =
+ CVarDef.Create("net.gasoverlaytickrate", 3.0f);
+
+ public static readonly CVarDef GasOverlayThresholds =
+ CVarDef.Create("net.gasoverlaythresholds", 20);
+}
diff --git a/Content.Shared/CCVar/CCVars.Parallax.cs b/Content.Shared/CCVar/CCVars.Parallax.cs
new file mode 100644
index 00000000000000..9b19c8f4943614
--- /dev/null
+++ b/Content.Shared/CCVar/CCVars.Parallax.cs
@@ -0,0 +1,15 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+ public static readonly CVarDef ParallaxEnabled =
+ CVarDef.Create("parallax.enabled", true, CVar.CLIENTONLY);
+
+ public static readonly CVarDef ParallaxDebug =
+ CVarDef.Create("parallax.debug", false, CVar.CLIENTONLY);
+
+ public static readonly CVarDef