]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Separate CCVars into separate files
authorSimon <63975668+Simyon264@users.noreply.github.com>
Tue, 12 Nov 2024 02:10:25 +0000 (03:10 +0100)
committerSimon <63975668+Simyon264@users.noreply.github.com>
Tue, 12 Nov 2024 02:10:25 +0000 (03:10 +0100)
44 files changed:
Content.Shared/CCVar/CCVars.Accessibility.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Admin.Ahelp.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Admin.Logs.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Admin.Rules.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Admin.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Atmos.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Audio.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Chat.Looc.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Chat.Ooc.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Chat.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Config.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Console.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Crewmanifest.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Database.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Discord.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Events.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Explosion.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Game.Infolinks.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Game.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Ghost.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Hud.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Ic.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Interactions.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Interface.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Mapping.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Midi.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Misc.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.NPC.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Net.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Parallax.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Physics.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Radiation.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Replays.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Salvage.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Server.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Shuttle.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Sounds.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Status.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Tips.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Viewport.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Vote.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Whitelist.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.Worldgen.cs [new file with mode: 0644]
Content.Shared/CCVar/CCVars.cs

diff --git a/Content.Shared/CCVar/CCVars.Accessibility.cs b/Content.Shared/CCVar/CCVars.Accessibility.cs
new file mode 100644 (file)
index 0000000..8eb61f0
--- /dev/null
@@ -0,0 +1,41 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /// <summary>
+    ///     Chat window opacity slider, controlling the alpha of the chat window background.
+    ///     Goes from to 0 (completely transparent) to 1 (completely opaque)
+    /// </summary>
+    public static readonly CVarDef<float> ChatWindowOpacity =
+        CVarDef.Create("accessibility.chat_window_transparency", 0.85f, CVar.CLIENTONLY | CVar.ARCHIVE);
+
+    /// <summary>
+    ///     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.
+    /// </summary>
+    public static readonly CVarDef<bool> ReducedMotion =
+        CVarDef.Create("accessibility.reduced_motion", false, CVar.CLIENTONLY | CVar.ARCHIVE);
+
+    public static readonly CVarDef<bool> ChatEnableColorName =
+        CVarDef.Create("accessibility.enable_color_name",
+            true,
+            CVar.CLIENTONLY | CVar.ARCHIVE,
+            "Toggles displaying names with individual colors.");
+
+    /// <summary>
+    ///     Screen shake intensity slider, controlling the intensity of the CameraRecoilSystem.
+    ///     Goes from 0 (no recoil at all) to 1 (regular amounts of recoil)
+    /// </summary>
+    public static readonly CVarDef<float> ScreenShakeIntensity =
+        CVarDef.Create("accessibility.screen_shake_intensity", 1f, CVar.CLIENTONLY | CVar.ARCHIVE);
+
+    /// <summary>
+    ///     A generic toggle for various visual effects that are color sensitive.
+    ///     As of 2/16/24, only applies to progress bar colors.
+    /// </summary>
+    public static readonly CVarDef<bool> 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 (file)
index 0000000..48f3965
--- /dev/null
@@ -0,0 +1,39 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /// <summary>
+    ///     Ahelp rate limit values are accounted in periods of this size (seconds).
+    ///     After the period has passed, the count resets.
+    /// </summary>
+    /// <seealso cref="AhelpRateLimitCount"/>
+    public static readonly CVarDef<float> AhelpRateLimitPeriod =
+        CVarDef.Create("ahelp.rate_limit_period", 2f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     How many ahelp messages are allowed in a single rate limit period.
+    /// </summary>
+    /// <seealso cref="AhelpRateLimitPeriod"/>
+    public static readonly CVarDef<int> AhelpRateLimitCount =
+        CVarDef.Create("ahelp.rate_limit_count", 10, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     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.
+    /// </summary>
+    /// <seealso cref="AdminUseCustomNamesAdminRank"/>
+    /// <seealso cref="AhelpAdminPrefixWebhook"/>
+    public static readonly CVarDef<bool> AhelpAdminPrefix =
+        CVarDef.Create("ahelp.admin_prefix", false, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     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.
+    /// </summary>
+    /// <seealso cref="AdminUseCustomNamesAdminRank"/>
+    /// <seealso cref="AhelpAdminPrefix"/>
+    public static readonly CVarDef<bool> 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 (file)
index 0000000..862456d
--- /dev/null
@@ -0,0 +1,42 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /// <summary>
+    ///     Controls if admin logs are enabled. Highly recommended to shut this off for development.
+    /// </summary>
+    public static readonly CVarDef<bool> AdminLogsEnabled =
+        CVarDef.Create("adminlogs.enabled", true, CVar.SERVERONLY);
+
+    public static readonly CVarDef<float> AdminLogsQueueSendDelay =
+        CVarDef.Create("adminlogs.queue_send_delay_seconds", 5f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     When to skip the waiting time to save in-round admin logs, if no admin logs are currently being saved
+    /// </summary>
+    public static readonly CVarDef<int> AdminLogsQueueMax =
+        CVarDef.Create("adminlogs.queue_max", 5000, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     When to skip the waiting time to save pre-round admin logs, if no admin logs are currently being saved
+    /// </summary>
+    public static readonly CVarDef<int> AdminLogsPreRoundQueueMax =
+        CVarDef.Create("adminlogs.pre_round_queue_max", 5000, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     When to start dropping logs
+    /// </summary>
+    public static readonly CVarDef<int> AdminLogsDropThreshold =
+        CVarDef.Create("adminlogs.drop_threshold", 20000, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     How many logs to send to the client at once
+    /// </summary>
+    public static readonly CVarDef<int> AdminLogsClientBatchSize =
+        CVarDef.Create("adminlogs.client_batch_size", 1000, CVar.SERVERONLY);
+
+    public static readonly CVarDef<string> 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 (file)
index 0000000..7385104
--- /dev/null
@@ -0,0 +1,18 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /// <summary>
+    ///     Time that players have to wait before rules can be accepted.
+    /// </summary>
+    public static readonly CVarDef<float> RulesWaitTime =
+        CVarDef.Create("rules.time", 45f, CVar.SERVER | CVar.REPLICATED);
+
+    /// <summary>
+    ///     Don't show rules to localhost/loopback interface.
+    /// </summary>
+    public static readonly CVarDef<bool> 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 (file)
index 0000000..28bebfb
--- /dev/null
@@ -0,0 +1,163 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    public static readonly CVarDef<bool> AdminAnnounceLogin =
+        CVarDef.Create("admin.announce_login", true, CVar.SERVERONLY);
+
+    public static readonly CVarDef<bool> AdminAnnounceLogout =
+        CVarDef.Create("admin.announce_logout", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     The token used to authenticate with the admin API. Leave empty to disable the admin API. This is a secret! Do not share!
+    /// </summary>
+    public static readonly CVarDef<string> AdminApiToken =
+        CVarDef.Create("admin.api_token", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL);
+
+    /// <summary>
+    ///     Should users be able to see their own notes? Admins will be able to see and set notes regardless
+    /// </summary>
+    public static readonly CVarDef<bool> SeeOwnNotes =
+        CVarDef.Create("admin.see_own_notes", false, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
+
+    /// <summary>
+    ///     Should the server play a quick sound to the active admins whenever a new player joins?
+    /// </summary>
+    public static readonly CVarDef<bool> AdminNewPlayerJoinSound =
+        CVarDef.Create("admin.new_player_join_sound", false, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     The amount of days before the note starts fading. It will slowly lose opacity until it reaches stale. Set to 0 to disable.
+    /// </summary>
+    public static readonly CVarDef<double> NoteFreshDays =
+        CVarDef.Create("admin.note_fresh_days", 91.31055, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
+
+    /// <summary>
+    ///     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.
+    /// </summary>
+    public static readonly CVarDef<double> NoteStaleDays =
+        CVarDef.Create("admin.note_stale_days", 365.2422, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
+
+    /// <summary>
+    ///     How much time does the user have to wait in seconds before confirming that they saw an admin message?
+    /// </summary>
+    public static readonly CVarDef<float> MessageWaitTime =
+        CVarDef.Create("admin.message_wait_time", 3f, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
+
+    /// <summary>
+    ///     Default severity for role bans
+    /// </summary>
+    public static readonly CVarDef<string> RoleBanDefaultSeverity =
+        CVarDef.Create("admin.role_ban_default_severity", "medium", CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED);
+
+    /// <summary>
+    ///     Default severity for department bans
+    /// </summary>
+    public static readonly CVarDef<string> DepartmentBanDefaultSeverity =
+        CVarDef.Create("admin.department_ban_default_severity", "medium", CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED);
+
+    /// <summary>
+    ///     Default severity for server bans
+    /// </summary>
+    public static readonly CVarDef<string> ServerBanDefaultSeverity =
+        CVarDef.Create("admin.server_ban_default_severity", "High", CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED);
+
+    /// <summary>
+    ///     Whether a server ban will ban the player's ip by default.
+    /// </summary>
+    public static readonly CVarDef<bool> ServerBanIpBanDefault =
+        CVarDef.Create("admin.server_ban_ip_ban_default", true, CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED);
+
+    /// <summary>
+    ///     Whether a server ban will ban the player's hardware id by default.
+    /// </summary>
+    public static readonly CVarDef<bool> ServerBanHwidBanDefault =
+        CVarDef.Create("admin.server_ban_hwid_ban_default", true, CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED);
+
+    /// <summary>
+    ///     Whether to use details from last connection for ip/hwid in the BanPanel.
+    /// </summary>
+    public static readonly CVarDef<bool> ServerBanUseLastDetails =
+        CVarDef.Create("admin.server_ban_use_last_details", true, CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED);
+
+    /// <summary>
+    ///     Whether to erase a player's chat messages and their entity from the game when banned.
+    /// </summary>
+    public static readonly CVarDef<bool> ServerBanErasePlayer =
+        CVarDef.Create("admin.server_ban_erase_player", false, CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED);
+
+    /// <summary>
+    ///     Minimum players sharing a connection required to create an alert. -1 to disable the alert.
+    /// </summary>
+    /// <remarks>
+    ///     If you set this to 0 or 1 then it will alert on every connection, so probably don't do that.
+    /// </remarks>
+    public static readonly CVarDef<int> AdminAlertMinPlayersSharingConnection =
+        CVarDef.Create("admin.alert.min_players_sharing_connection", -1, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Minimum explosion intensity to create an admin alert message. -1 to disable the alert.
+    /// </summary>
+    public static readonly CVarDef<int> AdminAlertExplosionMinIntensity =
+        CVarDef.Create("admin.alert.explosion_min_intensity", 60, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Minimum particle accelerator strength to create an admin alert message.
+    /// </summary>
+    public static readonly CVarDef<int> AdminAlertParticleAcceleratorMinPowerState =
+        CVarDef.Create("admin.alert.particle_accelerator_min_power_state", 5, CVar.SERVERONLY); // strength 4
+
+    /// <summary>
+    ///     Should the ban details in admin channel include PII? (IP, HWID, etc)
+    /// </summary>
+    public static readonly CVarDef<bool> AdminShowPIIOnBan =
+        CVarDef.Create("admin.show_pii_onban", false, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     If an admin joins a round by reading up or using the late join button, automatically
+    ///     de-admin them.
+    /// </summary>
+    public static readonly CVarDef<bool> AdminDeadminOnJoin =
+        CVarDef.Create("admin.deadmin_on_join", false, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Overrides the name the client sees in ahelps. Set empty to disable.
+    /// </summary>
+    public static readonly CVarDef<string> AdminAhelpOverrideClientName =
+        CVarDef.Create("admin.override_adminname_in_client_ahelp", string.Empty, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     The threshold of minutes to appear as a "new player" in the ahelp menu
+    ///     If 0, appearing as a new player is disabled.
+    /// </summary>
+    public static readonly CVarDef<int> NewPlayerThreshold =
+        CVarDef.Create("admin.new_player_threshold", 0, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
+
+    /// <summary>
+    ///     How long an admin client can go without any input before being considered AFK.
+    /// </summary>
+    public static readonly CVarDef<float> AdminAfkTime =
+        CVarDef.Create("admin.afk_time", 600f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     If true, admins are able to connect even if
+    ///     <see cref="SoftMaxPlayers"/> would otherwise block regular players.
+    /// </summary>
+    public static readonly CVarDef<bool> AdminBypassMaxPlayers =
+        CVarDef.Create("admin.bypass_max_players", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Determine if custom rank names are used.
+    ///     If it is false, it'd use the actual rank name regardless of the individual's title.
+    /// </summary>
+    /// <seealso cref="AhelpAdminPrefix"/>
+    /// <seealso cref="AhelpAdminPrefixWebhook"/>
+    public static readonly CVarDef<bool> AdminUseCustomNamesAdminRank =
+        CVarDef.Create("admin.use_custom_names_admin_rank", true, CVar.SERVERONLY);
+
+    public static readonly CVarDef<bool> 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 (file)
index 0000000..cc1069b
--- /dev/null
@@ -0,0 +1,153 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /// <summary>
+    ///     Whether gas differences will move entities.
+    /// </summary>
+    public static readonly CVarDef<bool> SpaceWind =
+        CVarDef.Create("atmos.space_wind", false, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Divisor from maxForce (pressureDifference * 2.25f) to force applied on objects.
+    /// </summary>
+    public static readonly CVarDef<float> SpaceWindPressureForceDivisorThrow =
+        CVarDef.Create("atmos.space_wind_pressure_force_divisor_throw", 15f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Divisor from maxForce (pressureDifference * 2.25f) to force applied on objects.
+    /// </summary>
+    public static readonly CVarDef<float> SpaceWindPressureForceDivisorPush =
+        CVarDef.Create("atmos.space_wind_pressure_force_divisor_push", 2500f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     The maximum velocity (not force) that may be applied to an object by atmospheric pressure differences.
+    ///     Useful to prevent clipping through objects.
+    /// </summary>
+    public static readonly CVarDef<float> SpaceWindMaxVelocity =
+        CVarDef.Create("atmos.space_wind_max_velocity", 30f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     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.
+    /// </summary>
+    public static readonly CVarDef<float> SpaceWindMaxPushForce =
+        CVarDef.Create("atmos.space_wind_max_push_force", 20f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Whether monstermos tile equalization is enabled.
+    /// </summary>
+    public static readonly CVarDef<bool> MonstermosEqualization =
+        CVarDef.Create("atmos.monstermos_equalization", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Whether monstermos explosive depressurization is enabled.
+    ///     Needs <see cref="MonstermosEqualization"/> to be enabled to work.
+    /// </summary>
+    public static readonly CVarDef<bool> MonstermosDepressurization =
+        CVarDef.Create("atmos.monstermos_depressurization", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Whether monstermos explosive depressurization will rip tiles..
+    ///     Needs <see cref="MonstermosEqualization"/> and <see cref="MonstermosDepressurization"/> 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.
+    /// </summary>
+    public static readonly CVarDef<bool> MonstermosRipTiles =
+        CVarDef.Create("atmos.monstermos_rip_tiles", false, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Whether explosive depressurization will cause the grid to gain an impulse.
+    ///     Needs <see cref="MonstermosEqualization"/> and <see cref="MonstermosDepressurization"/> to be enabled to work.
+    /// </summary>
+    public static readonly CVarDef<bool> AtmosGridImpulse =
+        CVarDef.Create("atmos.grid_impulse", false, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     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
+    /// </summary>
+    public static readonly CVarDef<float> AtmosSpacingEscapeRatio =
+        CVarDef.Create("atmos.mmos_spacing_speed", 0.15f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     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.
+    /// </summary>
+    public static readonly CVarDef<float> AtmosSpacingMinGas =
+        CVarDef.Create("atmos.mmos_min_gas", 2.0f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     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)
+    /// </summary>
+    public static readonly CVarDef<float> AtmosSpacingMaxWind =
+        CVarDef.Create("atmos.mmos_max_wind", 500f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Whether atmos superconduction is enabled.
+    /// </summary>
+    /// <remarks> Disabled by default, superconduction is awful. </remarks>
+    public static readonly CVarDef<bool> Superconduction =
+        CVarDef.Create("atmos.superconduction", false, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Heat loss per tile due to radiation at 20 degC, in W.
+    /// </summary>
+    public static readonly CVarDef<float> SuperconductionTileLoss =
+        CVarDef.Create("atmos.superconduction_tile_loss", 30f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Whether excited groups will be processed and created.
+    /// </summary>
+    public static readonly CVarDef<bool> ExcitedGroups =
+        CVarDef.Create("atmos.excited_groups", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Whether all tiles in an excited group will clear themselves once being exposed to space.
+    ///     Similar to <see cref="MonstermosDepressurization"/>, without none of the tile ripping or
+    ///     things being thrown around very violently.
+    ///     Needs <see cref="ExcitedGroups"/> to be enabled to work.
+    /// </summary>
+    public static readonly CVarDef<bool> ExcitedGroupsSpaceIsAllConsuming =
+        CVarDef.Create("atmos.excited_groups_space_is_all_consuming", false, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Maximum time in milliseconds that atmos can take processing.
+    /// </summary>
+    public static readonly CVarDef<float> AtmosMaxProcessTime =
+        CVarDef.Create("atmos.max_process_time", 3f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Atmos tickrate in TPS. Atmos processing will happen every 1/TPS seconds.
+    /// </summary>
+    public static readonly CVarDef<float> AtmosTickRate =
+        CVarDef.Create("atmos.tickrate", 15f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     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.
+    /// </summary>
+    public static readonly CVarDef<float> AtmosSpeedup =
+        CVarDef.Create("atmos.speedup", 8f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Like atmos.speedup, but only for gas and reaction heat values. 64x means
+    ///     gases heat up and cool down 64x faster than real life.
+    /// </summary>
+    public static readonly CVarDef<float> AtmosHeatScale =
+        CVarDef.Create("atmos.heat_scale", 8f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     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.
+    /// </summary>
+    public static readonly CVarDef<float> 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 (file)
index 0000000..4d9e7c4
--- /dev/null
@@ -0,0 +1,61 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+        /// <summary>
+        ///     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.
+        /// </summary>
+        public static readonly CVarDef<float> AmbientCooldown =
+            CVarDef.Create("ambience.cooldown", 0.1f, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+        /// <summary>
+        ///     How large of a range to sample for ambience.
+        /// </summary>
+        public static readonly CVarDef<float> AmbientRange =
+            CVarDef.Create("ambience.range", 8f, CVar.REPLICATED | CVar.SERVER);
+
+        /// <summary>
+        ///     Maximum simultaneous ambient sounds.
+        /// </summary>
+        public static readonly CVarDef<int> MaxAmbientSources =
+            CVarDef.Create("ambience.max_sounds", 16, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+        /// <summary>
+        ///     The minimum value the user can set for ambience.max_sounds
+        /// </summary>
+        public static readonly CVarDef<int> MinMaxAmbientSourcesConfigured =
+            CVarDef.Create("ambience.min_max_sounds_configured", 16, CVar.REPLICATED | CVar.SERVER | CVar.CHEAT);
+
+        /// <summary>
+        ///     The maximum value the user can set for ambience.max_sounds
+        /// </summary>
+        public static readonly CVarDef<int> MaxMaxAmbientSourcesConfigured =
+            CVarDef.Create("ambience.max_max_sounds_configured", 64, CVar.REPLICATED | CVar.SERVER | CVar.CHEAT);
+
+        /// <summary>
+        ///     Ambience volume.
+        /// </summary>
+        public static readonly CVarDef<float> AmbienceVolume =
+            CVarDef.Create("ambience.volume", 1.5f, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+        /// <summary>
+        ///     Ambience music volume.
+        /// </summary>
+        public static readonly CVarDef<float> AmbientMusicVolume =
+            CVarDef.Create("ambience.music_volume", 1.5f, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+        /// <summary>
+        ///     Lobby / round end music volume.
+        /// </summary>
+        public static readonly CVarDef<float> LobbyMusicVolume =
+            CVarDef.Create("ambience.lobby_music_volume", 0.50f, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+        /// <summary>
+        ///     UI volume.
+        /// </summary>
+        public static readonly CVarDef<float> 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 (file)
index 0000000..84ee2c2
--- /dev/null
@@ -0,0 +1,26 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    public static readonly CVarDef<bool> LoocEnabled =
+        CVarDef.Create("looc.enabled", true, CVar.NOTIFY | CVar.REPLICATED);
+
+    public static readonly CVarDef<bool> AdminLoocEnabled =
+        CVarDef.Create("looc.enabled_admin", true, CVar.NOTIFY);
+
+    /// <summary>
+    ///     True: Dead players can use LOOC
+    ///     False: Dead player LOOC gets redirected to dead chat
+    /// </summary>
+    public static readonly CVarDef<bool> DeadLoocEnabled =
+        CVarDef.Create("looc.enabled_dead", false, CVar.NOTIFY | CVar.REPLICATED);
+
+    /// <summary>
+    ///     True: Crit players can use LOOC
+    ///     False: Crit player LOOC gets redirected to dead chat
+    /// </summary>
+    public static readonly CVarDef<bool> 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 (file)
index 0000000..ba5e410
--- /dev/null
@@ -0,0 +1,27 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    public static readonly CVarDef<bool>
+        OocEnabled = CVarDef.Create("ooc.enabled", true, CVar.NOTIFY | CVar.REPLICATED);
+
+    public static readonly CVarDef<bool> AdminOocEnabled =
+        CVarDef.Create("ooc.enabled_admin", true, CVar.NOTIFY);
+
+    /// <summary>
+    ///     If true, whenever OOC is disabled the Discord OOC relay will also be disabled.
+    /// </summary>
+    public static readonly CVarDef<bool> DisablingOOCDisablesRelay =
+        CVarDef.Create("ooc.disabling_ooc_disables_relay", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Whether or not OOC chat should be enabled during a round.
+    /// </summary>
+    public static readonly CVarDef<bool> OocEnableDuringRound =
+        CVarDef.Create("ooc.enable_during_round", false, CVar.NOTIFY | CVar.REPLICATED | CVar.SERVER);
+
+    public static readonly CVarDef<bool> 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 (file)
index 0000000..139a823
--- /dev/null
@@ -0,0 +1,68 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /// <summary>
+    ///     Chat rate limit values are accounted in periods of this size (seconds).
+    ///     After the period has passed, the count resets.
+    /// </summary>
+    /// <seealso cref="ChatRateLimitCount"/>
+    public static readonly CVarDef<float> ChatRateLimitPeriod =
+        CVarDef.Create("chat.rate_limit_period", 2f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     How many chat messages are allowed in a single rate limit period.
+    /// </summary>
+    /// <remarks>
+    ///     The total rate limit throughput per second is effectively
+    ///     <see cref="ChatRateLimitCount"/> divided by <see cref="ChatRateLimitCount"/>.
+    /// </remarks>
+    /// <seealso cref="ChatRateLimitPeriod"/>
+    public static readonly CVarDef<int> ChatRateLimitCount =
+        CVarDef.Create("chat.rate_limit_count", 10, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Minimum delay (in seconds) between notifying admins about chat message rate limit violations.
+    ///     A negative value disables admin announcements.
+    /// </summary>
+    public static readonly CVarDef<int> ChatRateLimitAnnounceAdminsDelay =
+        CVarDef.Create("chat.rate_limit_announce_admins_delay", 15, CVar.SERVERONLY);
+
+    public static readonly CVarDef<int> ChatMaxMessageLength =
+        CVarDef.Create("chat.max_message_length", 1000, CVar.SERVER | CVar.REPLICATED);
+
+    public static readonly CVarDef<int> ChatMaxAnnouncementLength =
+        CVarDef.Create("chat.max_announcement_length", 256, CVar.SERVER | CVar.REPLICATED);
+
+    public static readonly CVarDef<bool> ChatSanitizerEnabled =
+        CVarDef.Create("chat.chat_sanitizer_enabled", true, CVar.SERVERONLY);
+
+    public static readonly CVarDef<bool> ChatShowTypingIndicator =
+        CVarDef.Create("chat.show_typing_indicator", true, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
+
+    public static readonly CVarDef<bool> 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<bool> ChatFancyNameBackground =
+        CVarDef.Create("chat.fancy_name_background",
+            false,
+            CVar.CLIENTONLY | CVar.ARCHIVE,
+            "Toggles displaying a background under the speaking character's name.");
+
+    /// <summary>
+    ///     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.
+    /// </summary>
+    public static readonly CVarDef<string> 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 (file)
index 0000000..4e11f09
--- /dev/null
@@ -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.
+
+    /// <summary>
+    ///     Configuration presets to load during startup.
+    ///     Multiple presets can be separated by comma and are loaded in order.
+    /// </summary>
+    /// <remarks>
+    ///     Loaded presets must be located under the <c>ConfigPresets/</c> resource directory and end with the <c>.toml</c> extension.
+    ///     Only the file name (without extension) must be given for this variable.
+    /// </remarks>
+    public static readonly CVarDef<string> ConfigPresets =
+        CVarDef.Create("config.presets", "", CVar.SERVERONLY);
+
+    /// <summary>
+    ///     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 <c>DEVELOPMENT</c> set.
+    /// </summary>
+    public static readonly CVarDef<bool> ConfigPresetDevelopment =
+        CVarDef.Create("config.preset_development", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Whether to load the preset debug CVars.
+    ///     Even when true, these are only loaded if the game is compiled with <c>DEBUG</c> set.
+    /// </summary>
+    public static readonly CVarDef<bool> 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 (file)
index 0000000..e670b9f
--- /dev/null
@@ -0,0 +1,15 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    public static readonly CVarDef<bool> ConsoleLoginLocal =
+        CVarDef.Create("console.loginlocal", true, CVar.ARCHIVE | CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Automatically log in the given user as host, equivalent to the <c>promotehost</c> command.
+    /// </summary>
+    public static readonly CVarDef<string> 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 (file)
index 0000000..d625188
--- /dev/null
@@ -0,0 +1,24 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /// <summary>
+    ///     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.
+    /// </summary>
+    public static readonly CVarDef<bool> CrewManifestWithoutEntity =
+        CVarDef.Create("crewmanifest.no_entity", true, CVar.REPLICATED);
+
+    /// <summary>
+    ///     Setting this allows the crew manifest to be viewed from 'unsecure'
+    ///     entities, such as the PDA.
+    /// </summary>
+    public static readonly CVarDef<bool> 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 (file)
index 0000000..c549bd7
--- /dev/null
@@ -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<string> DatabaseEngine =
+        CVarDef.Create("database.engine", "sqlite", CVar.SERVERONLY);
+
+    public static readonly CVarDef<string> DatabaseSqliteDbPath =
+        CVarDef.Create("database.sqlite_dbpath", "preferences.db", CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Milliseconds to asynchronously delay all SQLite database acquisitions with.
+    /// </summary>
+    /// <remarks>
+    ///     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)
+    /// </remarks>
+    public static readonly CVarDef<int> DatabaseSqliteDelay =
+        CVarDef.Create("database.sqlite_delay", DefaultSqliteDelay, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Amount of concurrent SQLite database operations.
+    /// </summary>
+    /// <remarks>
+    ///     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.
+    /// </remarks>
+    public static readonly CVarDef<int> DatabaseSqliteConcurrency =
+        CVarDef.Create("database.sqlite_concurrency", 3, CVar.SERVERONLY);
+
+    public static readonly CVarDef<string> DatabasePgHost =
+        CVarDef.Create("database.pg_host", "localhost", CVar.SERVERONLY);
+
+    public static readonly CVarDef<int> DatabasePgPort =
+        CVarDef.Create("database.pg_port", 5432, CVar.SERVERONLY);
+
+    public static readonly CVarDef<string> DatabasePgDatabase =
+        CVarDef.Create("database.pg_database", "ss14", CVar.SERVERONLY);
+
+    public static readonly CVarDef<string> DatabasePgUsername =
+        CVarDef.Create("database.pg_username", "postgres", CVar.SERVERONLY);
+
+    public static readonly CVarDef<string> DatabasePgPassword =
+        CVarDef.Create("database.pg_password", "", CVar.SERVERONLY | CVar.CONFIDENTIAL);
+
+    /// <summary>
+    ///     Max amount of concurrent Postgres database operations.
+    /// </summary>
+    public static readonly CVarDef<int> DatabasePgConcurrency =
+        CVarDef.Create("database.pg_concurrency", 8, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Milliseconds to asynchronously delay all PostgreSQL database operations with.
+    /// </summary>
+    /// <remarks>
+    ///     This is intended for performance testing. It works different from <see cref="DatabaseSqliteDelay"/>,
+    ///     as the lag is applied after acquiring the database lock.
+    /// </remarks>
+    public static readonly CVarDef<int> DatabasePgFakeLag =
+        CVarDef.Create("database.pg_fake_lag", 0, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Basically only exists for integration tests to avoid race conditions.
+    /// </summary>
+    public static readonly CVarDef<bool> 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 (file)
index 0000000..a6c4ada
--- /dev/null
@@ -0,0 +1,61 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /// <summary>
+    ///     The role that will get mentioned if a new SOS ahelp comes in.
+    /// </summary>
+    public static readonly CVarDef<string> DiscordAhelpMention =
+        CVarDef.Create("discord.on_call_ping", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL);
+
+    /// <summary>
+    ///     URL of the discord webhook to relay unanswered ahelp messages.
+    /// </summary>
+    public static readonly CVarDef<string> DiscordOnCallWebhook =
+        CVarDef.Create("discord.on_call_webhook", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL);
+
+    /// <summary>
+    ///     URL of the Discord webhook which will relay all ahelp messages.
+    /// </summary>
+    public static readonly CVarDef<string> DiscordAHelpWebhook =
+        CVarDef.Create("discord.ahelp_webhook", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL);
+
+    /// <summary>
+    ///     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.
+    /// </summary>
+    public static readonly CVarDef<string> DiscordAHelpFooterIcon =
+        CVarDef.Create("discord.ahelp_footer_icon", string.Empty, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     The avatar to use for the webhook. Should be an URL.
+    /// </summary>
+    public static readonly CVarDef<string> DiscordAHelpAvatar =
+        CVarDef.Create("discord.ahelp_avatar", string.Empty, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     URL of the Discord webhook which will relay all custom votes. If left empty, disables the webhook.
+    /// </summary>
+    public static readonly CVarDef<string> DiscordVoteWebhook =
+        CVarDef.Create("discord.vote_webhook", string.Empty, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     URL of the Discord webhook which will relay all votekick votes. If left empty, disables the webhook.
+    /// </summary>
+    public static readonly CVarDef<string> DiscordVotekickWebhook =
+        CVarDef.Create("discord.votekick_webhook", string.Empty, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     URL of the Discord webhook which will relay round restart messages.
+    /// </summary>
+    public static readonly CVarDef<string> DiscordRoundUpdateWebhook =
+        CVarDef.Create("discord.round_update_webhook", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL);
+
+    /// <summary>
+    ///     Role id for the Discord webhook to ping when the round ends.
+    /// </summary>
+    public static readonly CVarDef<string> 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 (file)
index 0000000..48797b8
--- /dev/null
@@ -0,0 +1,12 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /// <summary>
+    ///     Controls if the game should run station events
+    /// </summary>
+    public static readonly CVarDef<bool>
+        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 (file)
index 0000000..51d9345
--- /dev/null
@@ -0,0 +1,108 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /// <summary>
+    ///     How many tiles the explosion system will process per tick
+    /// </summary>
+    /// <remarks>
+    ///     Setting this too high will put a large load on a single tick. Setting this too low will lead to
+    ///     unnaturally "slow" explosions.
+    /// </remarks>
+    public static readonly CVarDef<int> ExplosionTilesPerTick =
+        CVarDef.Create("explosion.tiles_per_tick", 100, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Upper limit on the size of an explosion before physics-throwing is disabled.
+    /// </summary>
+    /// <remarks>
+    ///     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.
+    /// </remarks>
+    public static readonly CVarDef<int> ExplosionThrowLimit =
+        CVarDef.Create("explosion.throw_limit", 400, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     If this is true, explosion processing will pause the NodeGroupSystem to pause updating.
+    /// </summary>
+    /// <remarks>
+    ///     This only takes effect if an explosion needs more than one tick to process (i.e., covers more than <see
+    ///     cref="ExplosionTilesPerTick"/> tiles). If this is not enabled, the node-system will rebuild its graph
+    ///     every tick as the explosion shreds the station, causing significant slowdown.
+    /// </remarks>
+    public static readonly CVarDef<bool> ExplosionSleepNodeSys =
+        CVarDef.Create("explosion.node_sleep", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     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.
+    /// </summary>
+    /// <remarks>
+    ///     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.
+    /// </remarks>
+    public static readonly CVarDef<int> ExplosionMaxArea =
+        CVarDef.Create("explosion.max_area", (int)3.14f * 256 * 256, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Upper limit on the number of neighbor finding steps for the explosion system neighbor-finding algorithm.
+    /// </summary>
+    /// <remarks>
+    ///     Effectively places an upper limit on the range that any explosion can have. In the vast majority of
+    ///     instances, <see cref="ExplosionMaxArea"/> will likely be hit before this becomes a limiting factor.
+    /// </remarks>
+    public static readonly CVarDef<int> ExplosionMaxIterations =
+        CVarDef.Create("explosion.max_iterations", 500, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Max Time in milliseconds to spend processing explosions every tick.
+    /// </summary>
+    /// <remarks>
+    ///     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.
+    /// </remarks>
+    public static readonly CVarDef<float> ExplosionMaxProcessingTime =
+        CVarDef.Create("explosion.max_tick_time", 7f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     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.
+    /// </summary>
+    /// <remarks>
+    ///     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.
+    /// </remarks>
+    public static readonly CVarDef<bool> ExplosionIncrementalTileBreaking =
+        CVarDef.Create("explosion.incremental_tile", false, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     This determines for how many seconds an explosion should stay visible once it has finished expanding.
+    /// </summary>
+    public static readonly CVarDef<float> ExplosionPersistence =
+        CVarDef.Create("explosion.persistence", 1.0f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     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.
+    /// </summary>
+    /// <remarks>
+    ///     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 <see
+    ///     cref="ExplosionMaxProcessingTime"/> and <see cref="ExplosionTilesPerTick"/> 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.
+    /// </remarks>
+    public static readonly CVarDef<int> ExplosionSingleTickAreaLimit =
+        CVarDef.Create("explosion.single_tick_area_limit", 400, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Whether or not explosions are allowed to create tiles that have
+    ///     <see cref="ContentTileDefinition.MapAtmosphere"/> set to true.
+    /// </summary>
+    public static readonly CVarDef<bool> 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 (file)
index 0000000..fa8332b
--- /dev/null
@@ -0,0 +1,54 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /// <summary>
+    ///     Link to Discord server to show in the launcher.
+    /// </summary>
+    public static readonly CVarDef<string> InfoLinksDiscord =
+        CVarDef.Create("infolinks.discord", "", CVar.SERVER | CVar.REPLICATED);
+
+    /// <summary>
+    ///     Link to website to show in the launcher.
+    /// </summary>
+    public static readonly CVarDef<string> InfoLinksForum =
+        CVarDef.Create("infolinks.forum", "", CVar.SERVER | CVar.REPLICATED);
+
+    /// <summary>
+    ///     Link to GitHub page to show in the launcher.
+    /// </summary>
+    public static readonly CVarDef<string> InfoLinksGithub =
+        CVarDef.Create("infolinks.github", "", CVar.SERVER | CVar.REPLICATED);
+
+    /// <summary>
+    ///     Link to website to show in the launcher.
+    /// </summary>
+    public static readonly CVarDef<string> InfoLinksWebsite =
+        CVarDef.Create("infolinks.website", "", CVar.SERVER | CVar.REPLICATED);
+
+    /// <summary>
+    ///     Link to wiki to show in the launcher.
+    /// </summary>
+    public static readonly CVarDef<string> InfoLinksWiki =
+        CVarDef.Create("infolinks.wiki", "", CVar.SERVER | CVar.REPLICATED);
+
+    /// <summary>
+    ///     Link to Patreon. Not shown in the launcher currently.
+    /// </summary>
+    public static readonly CVarDef<string> InfoLinksPatreon =
+        CVarDef.Create("infolinks.patreon", "", CVar.SERVER | CVar.REPLICATED);
+
+    /// <summary>
+    ///     Link to the bug report form.
+    /// </summary>
+    public static readonly CVarDef<string> InfoLinksBugReport =
+        CVarDef.Create("infolinks.bug_report", "", CVar.SERVER | CVar.REPLICATED);
+
+    /// <summary>
+    ///     Link to site handling ban appeals. Shown in ban disconnect messages.
+    /// </summary>
+    public static readonly CVarDef<string> 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 (file)
index 0000000..1909205
--- /dev/null
@@ -0,0 +1,336 @@
+using Content.Shared.Roles;
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+        /// <summary>
+        ///     Disables most functionality in the GameTicker.
+        /// </summary>
+        public static readonly CVarDef<bool>
+            GameDummyTicker = CVarDef.Create("game.dummyticker", false, CVar.ARCHIVE | CVar.SERVERONLY);
+
+        /// <summary>
+        ///     Controls if the lobby is enabled. If it is not, and there are no available jobs, you may get stuck on a black screen.
+        /// </summary>
+        public static readonly CVarDef<bool>
+            GameLobbyEnabled = CVarDef.Create("game.lobbyenabled", true, CVar.ARCHIVE);
+
+        /// <summary>
+        ///     Controls the duration of the lobby timer in seconds. Defaults to 2 minutes and 30 seconds.
+        /// </summary>
+        public static readonly CVarDef<int>
+            GameLobbyDuration = CVarDef.Create("game.lobbyduration", 150, CVar.ARCHIVE);
+
+        /// <summary>
+        ///     Controls if players can latejoin at all.
+        /// </summary>
+        public static readonly CVarDef<bool>
+            GameDisallowLateJoins = CVarDef.Create("game.disallowlatejoins", false, CVar.ARCHIVE | CVar.SERVERONLY);
+
+        /// <summary>
+        ///     Controls the default game preset.
+        /// </summary>
+        public static readonly CVarDef<string>
+            GameLobbyDefaultPreset = CVarDef.Create("game.defaultpreset", "secret", CVar.ARCHIVE);
+
+        /// <summary>
+        ///     Controls if the game can force a different preset if the current preset's criteria are not met.
+        /// </summary>
+        public static readonly CVarDef<bool>
+            GameLobbyFallbackEnabled = CVarDef.Create("game.fallbackenabled", true, CVar.ARCHIVE);
+
+        /// <summary>
+        ///     The preset for the game to fall back to if the selected preset could not be used, and fallback is enabled.
+        /// </summary>
+        public static readonly CVarDef<string>
+            GameLobbyFallbackPreset = CVarDef.Create("game.fallbackpreset", "Traitor,Extended", CVar.ARCHIVE);
+
+        /// <summary>
+        ///     Controls if people can win the game in Suspicion or Deathmatch.
+        /// </summary>
+        public static readonly CVarDef<bool>
+            GameLobbyEnableWin = CVarDef.Create("game.enablewin", true, CVar.ARCHIVE);
+
+        /// <summary>
+        ///     Controls the maximum number of character slots a player is allowed to have.
+        /// </summary>
+        public static readonly CVarDef<int>
+            GameMaxCharacterSlots = CVarDef.Create("game.maxcharacterslots", 30, CVar.ARCHIVE | CVar.SERVERONLY);
+
+        /// <summary>
+        ///     Controls the game map prototype to load. SS14 stores these prototypes in Prototypes/Maps.
+        /// </summary>
+        public static readonly CVarDef<string>
+            GameMap = CVarDef.Create("game.map", string.Empty, CVar.SERVERONLY);
+
+        /// <summary>
+        ///     Controls whether to use world persistence or not.
+        /// </summary>
+        public static readonly CVarDef<bool>
+            UsePersistence = CVarDef.Create("game.usepersistence", false, CVar.ARCHIVE);
+
+        /// <summary>
+        ///     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).
+        /// </summary>
+        public static readonly CVarDef<string>
+            PersistenceMap = CVarDef.Create("game.persistencemap", "Empty", CVar.ARCHIVE);
+
+        /// <summary>
+        ///     Prototype to use for map pool.
+        /// </summary>
+        public static readonly CVarDef<string>
+            GameMapPool = CVarDef.Create("game.map_pool", "DefaultMapPool", CVar.SERVERONLY);
+
+        /// <summary>
+        ///     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.
+        /// </summary>
+        public static readonly CVarDef<int>
+            GameMapMemoryDepth = CVarDef.Create("game.map_memory_depth", 16, CVar.SERVERONLY);
+
+        /// <summary>
+        ///     Is map rotation enabled?
+        /// </summary>
+        public static readonly CVarDef<bool>
+            GameMapRotation = CVarDef.Create("game.map_rotation", true, CVar.SERVERONLY);
+
+        /// <summary>
+        ///     If roles should be restricted based on time.
+        /// </summary>
+        public static readonly CVarDef<bool>
+            GameRoleTimers = CVarDef.Create("game.role_timers", true, CVar.SERVER | CVar.REPLICATED);
+
+        /// <summary>
+        ///     Override default role requirements using a <see cref="JobRequirementOverridePrototype"/>
+        /// </summary>
+        public static readonly CVarDef<string>
+            GameRoleTimerOverride = CVarDef.Create("game.role_timer_override", "", CVar.SERVER | CVar.REPLICATED);
+
+        /// <summary>
+        ///     If roles should be restricted based on whether or not they are whitelisted.
+        /// </summary>
+        public static readonly CVarDef<bool>
+            GameRoleWhitelist = CVarDef.Create("game.role_whitelist", true, CVar.SERVER | CVar.REPLICATED);
+
+        /// <summary>
+        ///     Whether or not disconnecting inside of a cryopod should remove the character or just store them until they reconnect.
+        /// </summary>
+        public static readonly CVarDef<bool>
+            GameCryoSleepRejoining = CVarDef.Create("game.cryo_sleep_rejoining", false, CVar.SERVER | CVar.REPLICATED);
+
+        /// <summary>
+        ///     When enabled, guests will be assigned permanent UIDs and will have their preferences stored.
+        /// </summary>
+        public static readonly CVarDef<bool> GamePersistGuests =
+            CVarDef.Create("game.persistguests", true, CVar.ARCHIVE | CVar.SERVERONLY);
+
+        public static readonly CVarDef<bool> GameDiagonalMovement =
+            CVarDef.Create("game.diagonalmovement", true, CVar.ARCHIVE);
+
+        public static readonly CVarDef<int> SoftMaxPlayers =
+            CVarDef.Create("game.soft_max_players", 30, CVar.SERVERONLY | CVar.ARCHIVE);
+
+        /// <summary>
+        ///     If a player gets denied connection to the server,
+        ///     how long they are forced to wait before attempting to reconnect.
+        /// </summary>
+        public static readonly CVarDef<int> GameServerFullReconnectDelay =
+            CVarDef.Create("game.server_full_reconnect_delay", 30, CVar.SERVERONLY);
+
+        /// <summary>
+        ///     Whether or not panic bunker is currently enabled.
+        /// </summary>
+        public static readonly CVarDef<bool> PanicBunkerEnabled =
+            CVarDef.Create("game.panic_bunker.enabled", false, CVar.NOTIFY | CVar.REPLICATED | CVar.SERVER);
+
+        /// <summary>
+        ///     Whether or not the panic bunker will disable when an admin comes online.
+        /// </summary>
+        public static readonly CVarDef<bool> PanicBunkerDisableWithAdmins =
+            CVarDef.Create("game.panic_bunker.disable_with_admins", false, CVar.SERVERONLY);
+
+        /// <summary>
+        ///     Whether or not the panic bunker will enable when no admins are online.
+        /// </summary>
+        public static readonly CVarDef<bool> PanicBunkerEnableWithoutAdmins =
+            CVarDef.Create("game.panic_bunker.enable_without_admins", false, CVar.SERVERONLY);
+
+        /// <summary>
+        ///     Whether or not the panic bunker will count deadminned admins for
+        ///     <see cref="PanicBunkerDisableWithAdmins"/> and
+        ///     <see cref="PanicBunkerEnableWithoutAdmins"/>
+        /// </summary>
+        public static readonly CVarDef<bool> PanicBunkerCountDeadminnedAdmins =
+            CVarDef.Create("game.panic_bunker.count_deadminned_admins", false, CVar.SERVERONLY);
+
+        /// <summary>
+        ///     Show reason of disconnect for user or not.
+        /// </summary>
+        public static readonly CVarDef<bool> PanicBunkerShowReason =
+            CVarDef.Create("game.panic_bunker.show_reason", false, CVar.SERVERONLY);
+
+        /// <summary>
+        ///     Minimum age of the account (from server's PoV, so from first-seen date) in minutes.
+        /// </summary>
+        public static readonly CVarDef<int> PanicBunkerMinAccountAge =
+            CVarDef.Create("game.panic_bunker.min_account_age", 1440, CVar.SERVERONLY);
+
+        /// <summary>
+        ///     Minimal overall played time.
+        /// </summary>
+        public static readonly CVarDef<int> PanicBunkerMinOverallMinutes =
+            CVarDef.Create("game.panic_bunker.min_overall_minutes", 600, CVar.SERVERONLY);
+
+        /// <summary>
+        ///     A custom message that will be used for connections denied to the panic bunker
+        ///     If not empty, then will overwrite <see cref="PanicBunkerShowReason"/>
+        /// </summary>
+        public static readonly CVarDef<string> PanicBunkerCustomReason =
+            CVarDef.Create("game.panic_bunker.custom_reason", string.Empty, CVar.SERVERONLY);
+
+        /// <summary>
+        ///     Allow bypassing the panic bunker if the user is whitelisted.
+        /// </summary>
+        public static readonly CVarDef<bool> 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.
+         */
+
+        /// <summary>
+        ///     Whether the baby jail is currently enabled.
+        /// </summary>
+        public static readonly CVarDef<bool> BabyJailEnabled  =
+            CVarDef.Create("game.baby_jail.enabled", false, CVar.NOTIFY | CVar.REPLICATED | CVar.SERVER);
+
+        /// <summary>
+        ///     Show reason of disconnect for user or not.
+        /// </summary>
+        public static readonly CVarDef<bool> BabyJailShowReason =
+            CVarDef.Create("game.baby_jail.show_reason", false, CVar.SERVERONLY);
+
+        /// <summary>
+        ///     Maximum age of the account (from server's PoV, so from first-seen date) in minutes that can access baby
+        ///     jailed servers.
+        /// </summary>
+        public static readonly CVarDef<int> BabyJailMaxAccountAge =
+            CVarDef.Create("game.baby_jail.max_account_age", 1440, CVar.SERVERONLY);
+
+        /// <summary>
+        ///     Maximum overall played time allowed to access baby jailed servers.
+        /// </summary>
+        public static readonly CVarDef<int> BabyJailMaxOverallMinutes =
+            CVarDef.Create("game.baby_jail.max_overall_minutes", 120, CVar.SERVERONLY);
+
+        /// <summary>
+        ///     A custom message that will be used for connections denied due to the baby jail.
+        ///     If not empty, then will overwrite <see cref="BabyJailShowReason"/>
+        /// </summary>
+        public static readonly CVarDef<string> BabyJailCustomReason =
+            CVarDef.Create("game.baby_jail.custom_reason", string.Empty, CVar.SERVERONLY);
+
+        /// <summary>
+        ///     Allow bypassing the baby jail if the user is whitelisted.
+        /// </summary>
+        public static readonly CVarDef<bool> BypassBabyJailWhitelist =
+            CVarDef.Create("game.baby_jail.whitelisted_can_bypass", true, CVar.SERVERONLY);
+
+        /// <summary>
+        ///     Make people bonk when trying to climb certain objects like tables.
+        /// </summary>
+        public static readonly CVarDef<bool> GameTableBonk =
+            CVarDef.Create("game.table_bonk", false, CVar.REPLICATED);
+
+        /// <summary>
+        ///     Whether or not status icons are rendered for everyone.
+        /// </summary>
+        public static readonly CVarDef<bool> GlobalStatusIconsEnabled =
+            CVarDef.Create("game.global_status_icons_enabled", true, CVar.SERVER | CVar.REPLICATED);
+
+        /// <summary>
+        ///     Whether or not status icons are rendered on this specific client.
+        /// </summary>
+        public static readonly CVarDef<bool> LocalStatusIconsEnabled =
+            CVarDef.Create("game.local_status_icons_enabled", true, CVar.CLIENTONLY);
+
+        /// <summary>
+        ///     Whether or not coordinates on the Debug overlay should only be available to admins.
+        /// </summary>
+        public static readonly CVarDef<bool> DebugCoordinatesAdminOnly =
+            CVarDef.Create("game.debug_coordinates_admin_only", true, CVar.SERVER | CVar.REPLICATED);
+
+#if EXCEPTION_TOLERANCE
+        /// <summary>
+        ///     Amount of times round start must fail before the server is shut down.
+        ///     Set to 0 or a negative number to disable.
+        /// </summary>
+        public static readonly CVarDef<int> RoundStartFailShutdownCount =
+            CVarDef.Create("game.round_start_fail_shutdown_count", 5, CVar.SERVERONLY | CVar.SERVER);
+#endif
+
+        /// <summary>
+        ///     Delay between station alert level changes.
+        /// </summary>
+        public static readonly CVarDef<int> GameAlertLevelChangeDelay =
+            CVarDef.Create("game.alert_level_change_delay", 30, CVar.SERVERONLY);
+
+        /// <summary>
+        ///     The time in seconds that the server should wait before restarting the round.
+        ///     Defaults to 2 minutes.
+        /// </summary>
+        public static readonly CVarDef<float> RoundRestartTime =
+            CVarDef.Create("game.round_restart_time", 120f, CVar.SERVERONLY);
+
+        /// <summary>
+        ///     The prototype to use for secret weights.
+        /// </summary>
+        public static readonly CVarDef<string> SecretWeightPrototype =
+            CVarDef.Create("game.secret_weight_prototype", "Secret", CVar.SERVERONLY);
+
+        /// <summary>
+        ///     The id of the sound collection to randomly choose a sound from and play when the round ends.
+        /// </summary>
+        public static readonly CVarDef<string> RoundEndSoundCollection =
+            CVarDef.Create("game.round_end_sound_collection", "RoundEnd", CVar.SERVERONLY);
+
+        /// <summary>
+        ///     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.
+        /// </summary>
+        public static readonly CVarDef<bool> RoundEndPVSOverrides =
+            CVarDef.Create("game.round_end_pvs_overrides", true, CVar.SERVERONLY);
+
+        /// <summary>
+        ///     If true, players can place objects onto tabletop games like chess boards.
+        /// </summary>
+        /// <remarks>
+        ///     This feature is currently highly abusable and can easily be used to crash the server,
+        ///     so it's off by default.
+        /// </remarks>
+        public static readonly CVarDef<bool> GameTabletopPlace =
+            CVarDef.Create("game.tabletop_place", false, CVar.SERVERONLY);
+
+        /// <summary>
+        ///     If true, contraband severity can be viewed in the examine menu
+        /// </summary>
+        public static readonly CVarDef<bool> ContrabandExamine =
+            CVarDef.Create("game.contraband_examine", true, CVar.SERVER | CVar.REPLICATED);
+
+        /// <summary>
+        ///     Size of the lookup area for adding entities to the context menu
+        /// </summary>
+        public static readonly CVarDef<float> GameEntityMenuLookup =
+            CVarDef.Create("game.entity_menu_lookup", 0.25f, CVar.CLIENTONLY | CVar.ARCHIVE);
+
+        /// <summary>
+        ///     Should the clients window show the server hostname in the title?
+        /// </summary>
+        public static readonly CVarDef<bool> 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 (file)
index 0000000..39e7a3c
--- /dev/null
@@ -0,0 +1,24 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /// <summary>
+    ///     The time you must spend reading the rules, before the "Request" button is enabled
+    /// </summary>
+    public static readonly CVarDef<float> GhostRoleTime =
+        CVarDef.Create("ghost.role_time", 3f, CVar.REPLICATED | CVar.SERVER);
+
+    /// <summary>
+    ///     If ghost role lotteries should be made near-instanteous.
+    /// </summary>
+    public static readonly CVarDef<bool> GhostQuickLottery =
+        CVarDef.Create("ghost.quick_lottery", false, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Whether or not to kill the player's mob on ghosting, when it is in a critical health state.
+    /// </summary>
+    public static readonly CVarDef<bool> 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 (file)
index 0000000..f96924b
--- /dev/null
@@ -0,0 +1,24 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    public static readonly CVarDef<int> HudTheme =
+        CVarDef.Create("hud.theme", 0, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+    public static readonly CVarDef<bool> HudHeldItemShow =
+        CVarDef.Create("hud.held_item_show", true, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+    public static readonly CVarDef<bool> CombatModeIndicatorsPointShow =
+        CVarDef.Create("hud.combat_mode_indicators_point_show", true, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+    public static readonly CVarDef<bool> LoocAboveHeadShow =
+        CVarDef.Create("hud.show_looc_above_head", true, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+    public static readonly CVarDef<float> HudHeldItemOffset =
+        CVarDef.Create("hud.held_item_offset", 28f, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+    public static readonly CVarDef<bool> 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 (file)
index 0000000..e149e9f
--- /dev/null
@@ -0,0 +1,48 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /// <summary>
+    ///     Restricts IC character names to alphanumeric chars.
+    /// </summary>
+    public static readonly CVarDef<bool> RestrictedNames =
+        CVarDef.Create("ic.restricted_names", true, CVar.SERVER | CVar.REPLICATED);
+
+    /// <summary>
+    ///     Allows flavor text (character descriptions)
+    /// </summary>
+    public static readonly CVarDef<bool> FlavorText =
+        CVarDef.Create("ic.flavor_text", false, CVar.SERVER | CVar.REPLICATED);
+
+    /// <summary>
+    ///     Adds a period at the end of a sentence if the sentence ends in a letter.
+    /// </summary>
+    public static readonly CVarDef<bool> ChatPunctuation =
+        CVarDef.Create("ic.punctuation", false, CVar.SERVER);
+
+    /// <summary>
+    ///     Enables automatically forcing IC name rules. Uppercases the first letter of the first and last words of the name
+    /// </summary>
+    public static readonly CVarDef<bool> ICNameCase =
+        CVarDef.Create("ic.name_case", true, CVar.SERVER | CVar.REPLICATED);
+
+    /// <summary>
+    ///     Whether or not players' characters are randomly generated rather than using their selected characters in the creator.
+    /// </summary>
+    public static readonly CVarDef<bool> ICRandomCharacters =
+        CVarDef.Create("ic.random_characters", false, CVar.SERVER);
+
+    /// <summary>
+    ///     A weighted random prototype used to determine the species selected for random characters.
+    /// </summary>
+    public static readonly CVarDef<string> ICRandomSpeciesWeights =
+        CVarDef.Create("ic.random_species_weights", "SpeciesWeights", CVar.SERVER);
+
+    /// <summary>
+    ///     Control displaying SSD indicators near players
+    /// </summary>
+    public static readonly CVarDef<bool> 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 (file)
index 0000000..c62f81b
--- /dev/null
@@ -0,0 +1,54 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /// <summary>
+    ///     Deadzone for drag-drop interactions.
+    /// </summary>
+    public static readonly CVarDef<float> DragDropDeadZone =
+        CVarDef.Create("control.drag_dead_zone", 12f, CVar.CLIENTONLY | CVar.ARCHIVE);
+
+    /// <summary>
+    ///     Toggles whether the walking key is a toggle or a held key.
+    /// </summary>
+    public static readonly CVarDef<bool> 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.
+
+    /// <summary>
+    ///     Maximum number of interactions that a player can perform within <see cref="InteractionRateLimitCount"/> seconds
+    /// </summary>
+    public static readonly CVarDef<int> InteractionRateLimitCount =
+        CVarDef.Create("interaction.rate_limit_count", 5, CVar.SERVER | CVar.REPLICATED);
+
+    /// <seealso cref="InteractionRateLimitCount"/>
+    public static readonly CVarDef<float> InteractionRateLimitPeriod =
+        CVarDef.Create("interaction.rate_limit_period", 0.5f, CVar.SERVER | CVar.REPLICATED);
+
+    /// <summary>
+    ///     Minimum delay (in seconds) between notifying admins about interaction rate limit violations. A negative
+    ///     value disables admin announcements.
+    /// </summary>
+    public static readonly CVarDef<int> InteractionRateLimitAnnounceAdminsDelay =
+        CVarDef.Create("interaction.rate_limit_announce_admins_delay", 120, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Whether or not the storage UI is static and bound to the hotbar, or unbound and allowed to be dragged anywhere.
+    /// </summary>
+    public static readonly CVarDef<bool> StaticStorageUI =
+        CVarDef.Create("control.static_storage_ui", true, CVar.CLIENTONLY | CVar.ARCHIVE);
+
+    /// <summary>
+    ///     Whether or not the storage window uses a transparent or opaque sprite.
+    /// </summary>
+    public static readonly CVarDef<bool> 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 (file)
index 0000000..79a28e6
--- /dev/null
@@ -0,0 +1,24 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    public static readonly CVarDef<string> UIClickSound =
+        CVarDef.Create("interface.click_sound", "/Audio/UserInterface/click.ogg", CVar.REPLICATED);
+
+    public static readonly CVarDef<string> UIHoverSound =
+        CVarDef.Create("interface.hover_sound", "/Audio/UserInterface/hover.ogg", CVar.REPLICATED);
+
+    public static readonly CVarDef<string> UILayout =
+        CVarDef.Create("ui.layout", "Default", CVar.CLIENTONLY | CVar.ARCHIVE);
+
+    public static readonly CVarDef<string> DefaultScreenChatSize =
+        CVarDef.Create("ui.default_chat_size", "", CVar.CLIENTONLY | CVar.ARCHIVE);
+
+    public static readonly CVarDef<string> SeparatedScreenChatSize =
+        CVarDef.Create("ui.separated_chat_size", "0.6,0", CVar.CLIENTONLY | CVar.ARCHIVE);
+
+    public static readonly CVarDef<bool> 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 (file)
index 0000000..06cd287
--- /dev/null
@@ -0,0 +1,24 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /// <summary>
+    ///     Will mapping mode enable autosaves when it's activated?
+    /// </summary>
+    public static readonly CVarDef<bool>
+        AutosaveEnabled = CVarDef.Create("mapping.autosave", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Autosave interval in seconds.
+    /// </summary>
+    public static readonly CVarDef<float>
+        AutosaveInterval = CVarDef.Create("mapping.autosave_interval", 600f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Directory in server user data to save to. Saves will be inside folders in this directory.
+    /// </summary>
+    public static readonly CVarDef<string>
+        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 (file)
index 0000000..4ca4bfd
--- /dev/null
@@ -0,0 +1,18 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    public static readonly CVarDef<int> MaxMidiEventsPerSecond =
+        CVarDef.Create("midi.max_events_per_second", 1000, CVar.REPLICATED | CVar.SERVER);
+
+    public static readonly CVarDef<int> MaxMidiEventsPerBatch =
+        CVarDef.Create("midi.max_events_per_batch", 60, CVar.REPLICATED | CVar.SERVER);
+
+    public static readonly CVarDef<int> MaxMidiBatchesDropped =
+        CVarDef.Create("midi.max_batches_dropped", 1, CVar.SERVERONLY);
+
+    public static readonly CVarDef<int> 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 (file)
index 0000000..3d597c7
--- /dev/null
@@ -0,0 +1,97 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    public static readonly CVarDef<bool> HolidaysEnabled = CVarDef.Create("holidays.enabled", true, CVar.SERVERONLY);
+    public static readonly CVarDef<bool> BrandingSteam = CVarDef.Create("branding.steam", false, CVar.CLIENTONLY);
+    public static readonly CVarDef<int> EntityMenuGroupingType = CVarDef.Create("entity_menu", 0, CVar.CLIENTONLY);
+
+    /// <summary>
+    ///     Should we pre-load all of the procgen atlasses.
+    /// </summary>
+    public static readonly CVarDef<bool> ProcgenPreload =
+        CVarDef.Create("procgen.preload", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     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+).
+    /// </summary>
+    public static readonly CVarDef<bool> BiomassEasyMode =
+        CVarDef.Create("biomass.easy_mode", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     A scale factor applied to a grid's bounds when trying to find a spot to randomly generate an anomaly.
+    /// </summary>
+    public static readonly CVarDef<float> AnomalyGenerationGridBoundsScale =
+        CVarDef.Create("anomaly.generation_grid_bounds_scale", 0.6f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     How long a client can go without any input before being considered AFK.
+    /// </summary>
+    public static readonly CVarDef<float> AfkTime =
+        CVarDef.Create("afk.time", 60f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Flavor limit. This is to ensure that having a large mass of flavors in
+    ///     some food object won't spam a user with flavors.
+    /// </summary>
+    public static readonly CVarDef<int>
+        FlavorLimit = CVarDef.Create("flavor.limit", 10, CVar.SERVERONLY);
+
+    public static readonly CVarDef<string> DestinationFile =
+        CVarDef.Create("autogen.destination_file", "", CVar.SERVER | CVar.SERVERONLY);
+
+    /// <summary>
+    ///     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.
+    /// </summary>
+    public static readonly CVarDef<bool> ResourceUploadingStoreEnabled =
+        CVarDef.Create("netres.store_enabled", true, CVar.SERVER | CVar.SERVERONLY);
+
+    /// <summary>
+    ///     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.
+    /// </summary>
+    public static readonly CVarDef<int> ResourceUploadingStoreDeletionDays =
+        CVarDef.Create("netres.store_deletion_days", 30, CVar.SERVER | CVar.SERVERONLY);
+
+    /// <summary>
+    ///     If a server update restart is pending, the delay after the last player leaves before we actually restart. In seconds.
+    /// </summary>
+    public static readonly CVarDef<float> UpdateRestartDelay =
+        CVarDef.Create("update.restart_delay", 20f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     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.
+    /// </summary>
+    public static readonly CVarDef<bool> FireAlarmAllAccess =
+        CVarDef.Create("firealarm.allaccess", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Time between play time autosaves, in seconds.
+    /// </summary>
+    public static readonly CVarDef<float>
+        PlayTimeSaveInterval = CVarDef.Create("playtime.save_interval", 900f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     The maximum amount of time the entity GC can process, in ms.
+    /// </summary>
+    public static readonly CVarDef<int> GCMaximumTimeMs =
+        CVarDef.Create("entgc.maximum_time_ms", 5, CVar.SERVERONLY);
+
+    public static readonly CVarDef<bool> GatewayGeneratorEnabled =
+        CVarDef.Create("gateway.generator_enabled", true);
+
+    public static readonly CVarDef<string> TippyEntity =
+        CVarDef.Create("tippy.entity", "Tippy", CVar.SERVER | CVar.REPLICATED);
+
+    /// <summary>
+    ///     The number of seconds that must pass for a single entity to be able to point at something again.
+    /// </summary>
+    public static readonly CVarDef<float> 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 (file)
index 0000000..f0d5520
--- /dev/null
@@ -0,0 +1,16 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    public static readonly CVarDef<int> NPCMaxUpdates =
+        CVarDef.Create("npc.max_updates", 128);
+
+    public static readonly CVarDef<bool> NPCEnabled = CVarDef.Create("npc.enabled", true);
+
+    /// <summary>
+    ///     Should NPCs pathfind when steering. For debug purposes.
+    /// </summary>
+    public static readonly CVarDef<bool> 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 (file)
index 0000000..b7465de
--- /dev/null
@@ -0,0 +1,15 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    public static readonly CVarDef<float> NetAtmosDebugOverlayTickRate =
+        CVarDef.Create("net.atmosdbgoverlaytickrate", 3.0f);
+
+    public static readonly CVarDef<float> NetGasOverlayTickRate =
+        CVarDef.Create("net.gasoverlaytickrate", 3.0f);
+
+    public static readonly CVarDef<int> 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 (file)
index 0000000..9b19c8f
--- /dev/null
@@ -0,0 +1,15 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    public static readonly CVarDef<bool> ParallaxEnabled =
+        CVarDef.Create("parallax.enabled", true, CVar.CLIENTONLY);
+
+    public static readonly CVarDef<bool> ParallaxDebug =
+        CVarDef.Create("parallax.debug", false, CVar.CLIENTONLY);
+
+    public static readonly CVarDef<bool> ParallaxLowQuality =
+        CVarDef.Create("parallax.low_quality", false, CVar.ARCHIVE | CVar.CLIENTONLY);
+}
diff --git a/Content.Shared/CCVar/CCVars.Physics.cs b/Content.Shared/CCVar/CCVars.Physics.cs
new file mode 100644 (file)
index 0000000..379676b
--- /dev/null
@@ -0,0 +1,27 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /// <summary>
+    ///     When a mob is walking should its X / Y movement be relative to its parent (true) or the map (false).
+    /// </summary>
+    public static readonly CVarDef<bool> RelativeMovement =
+        CVarDef.Create("physics.relative_movement", true, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
+
+    public static readonly CVarDef<float> TileFrictionModifier =
+        CVarDef.Create("physics.tile_friction", 40.0f, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
+
+    public static readonly CVarDef<float> StopSpeed =
+        CVarDef.Create("physics.stop_speed", 0.1f, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
+
+    /// <summary>
+    ///     Whether mobs can push objects like lockers.
+    /// </summary>
+    /// <remarks>
+    ///     Technically client doesn't need to know about it but this may prevent a bug in the distant future so it stays.
+    /// </remarks>
+    public static readonly CVarDef<bool> MobPushing =
+        CVarDef.Create("physics.mob_pushing", false, CVar.REPLICATED | CVar.SERVER);
+}
diff --git a/Content.Shared/CCVar/CCVars.Radiation.cs b/Content.Shared/CCVar/CCVars.Radiation.cs
new file mode 100644 (file)
index 0000000..dfcce15
--- /dev/null
@@ -0,0 +1,32 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /// <summary>
+    ///     What is the smallest radiation dose in rads that can be received by object.
+    ///     Extremely small values may impact performance.
+    /// </summary>
+    public static readonly CVarDef<float> RadiationMinIntensity =
+        CVarDef.Create("radiation.min_intensity", 0.1f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Rate of radiation system update in seconds.
+    /// </summary>
+    public static readonly CVarDef<float> RadiationGridcastUpdateRate =
+        CVarDef.Create("radiation.gridcast.update_rate", 1.0f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     If both radiation source and receiver are placed on same grid, ignore grids between them.
+    ///     May get inaccurate result in some cases, but greatly boost performance in general.
+    /// </summary>
+    public static readonly CVarDef<bool> RadiationGridcastSimplifiedSameGrid =
+        CVarDef.Create("radiation.gridcast.simplified_same_grid", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Max distance that radiation ray can travel in meters.
+    /// </summary>
+    public static readonly CVarDef<float> RadiationGridcastMaxDistance =
+        CVarDef.Create("radiation.gridcast.max_distance", 50f, CVar.SERVERONLY);
+}
diff --git a/Content.Shared/CCVar/CCVars.Replays.cs b/Content.Shared/CCVar/CCVars.Replays.cs
new file mode 100644 (file)
index 0000000..64f47e8
--- /dev/null
@@ -0,0 +1,43 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /// <summary>
+    ///     Whether or not to record admin chat. If replays are being publicly distributes, this should probably be
+    ///     false.
+    /// </summary>
+    public static readonly CVarDef<bool> ReplayRecordAdminChat =
+        CVarDef.Create("replay.record_admin_chat", false, CVar.ARCHIVE);
+
+    /// <summary>
+    ///     Automatically record full rounds as replays.
+    /// </summary>
+    public static readonly CVarDef<bool> ReplayAutoRecord =
+        CVarDef.Create("replay.auto_record", false, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     The file name to record automatic replays to. The path is relative to <see cref="CVars.ReplayDirectory"/>.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    ///     If the path includes slashes, directories will be automatically created if necessary.
+    /// </para>
+    /// <para>
+    ///     A number of substitutions can be used to automatically fill in the file name: <c>{year}</c>, <c>{month}</c>, <c>{day}</c>, <c>{hour}</c>, <c>{minute}</c>, <c>{round}</c>.
+    /// </para>
+    /// </remarks>
+    public static readonly CVarDef<string> ReplayAutoRecordName =
+        CVarDef.Create("replay.auto_record_name",
+            "{year}_{month}_{day}-{hour}_{minute}-round_{round}.zip",
+            CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Path that, if provided, automatic replays are initially recorded in.
+    ///     When the recording is done, the file is moved into its final destination.
+    ///     Unless this path is rooted, it will be relative to <see cref="CVars.ReplayDirectory"/>.
+    /// </summary>
+    public static readonly CVarDef<string> ReplayAutoRecordTempDir =
+        CVarDef.Create("replay.auto_record_temp_dir", "", CVar.SERVERONLY);
+}
diff --git a/Content.Shared/CCVar/CCVars.Salvage.cs b/Content.Shared/CCVar/CCVars.Salvage.cs
new file mode 100644 (file)
index 0000000..ddc3327
--- /dev/null
@@ -0,0 +1,18 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /// <summary>
+    ///     Duration for missions
+    /// </summary>
+    public static readonly CVarDef<float>
+        SalvageExpeditionDuration = CVarDef.Create("salvage.expedition_duration", 660f, CVar.REPLICATED);
+
+    /// <summary>
+    ///     Cooldown for missions.
+    /// </summary>
+    public static readonly CVarDef<float>
+        SalvageExpeditionCooldown = CVarDef.Create("salvage.expedition_cooldown", 780f, CVar.REPLICATED);
+}
diff --git a/Content.Shared/CCVar/CCVars.Server.cs b/Content.Shared/CCVar/CCVars.Server.cs
new file mode 100644 (file)
index 0000000..2c86158
--- /dev/null
@@ -0,0 +1,43 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /*
+     * Server
+     */
+
+    /// <summary>
+    ///     Change this to have the changelog and rules "last seen" date stored separately.
+    /// </summary>
+    public static readonly CVarDef<string> ServerId =
+        CVarDef.Create("server.id", "unknown_server_id", CVar.REPLICATED | CVar.SERVER);
+
+    /// <summary>
+    ///     Guide Entry Prototype ID to be displayed as the server rules.
+    /// </summary>
+    public static readonly CVarDef<string> RulesFile =
+        CVarDef.Create("server.rules_file", "DefaultRuleset", CVar.REPLICATED | CVar.SERVER);
+
+    /// <summary>
+    ///     Guide entry that is displayed by default when a guide is opened.
+    /// </summary>
+    public static readonly CVarDef<string> DefaultGuide =
+        CVarDef.Create("server.default_guide", "NewPlayer", CVar.REPLICATED | CVar.SERVER);
+
+    /// <summary>
+    ///     If greater than 0, automatically restart the server after this many minutes of uptime.
+    /// </summary>
+    /// <remarks>
+    /// <para>
+    ///     This is intended to work around various bugs and performance issues caused by long continuous server uptime.
+    /// </para>
+    /// <para>
+    ///     This uses the same non-disruptive logic as update restarts,
+    ///     i.e. the game will only restart at round end or when there is nobody connected.
+    /// </para>
+    /// </remarks>
+    public static readonly CVarDef<int> ServerUptimeRestartMinutes =
+        CVarDef.Create("server.uptime_restart_minutes", 0, CVar.SERVERONLY);
+}
diff --git a/Content.Shared/CCVar/CCVars.Shuttle.cs b/Content.Shared/CCVar/CCVars.Shuttle.cs
new file mode 100644 (file)
index 0000000..f66fe9c
--- /dev/null
@@ -0,0 +1,176 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /// <summary>
+    ///     If true then the camera will match the grid / map and is unchangeable.
+    ///     - When traversing grids it will snap to 0 degrees rotation.
+    ///     False means the player has control over the camera rotation.
+    ///     - When traversing grids it will snap to the nearest cardinal which will generally be imperceptible.
+    /// </summary>
+    public static readonly CVarDef<bool> CameraRotationLocked =
+        CVarDef.Create("shuttle.camera_rotation_locked", false, CVar.REPLICATED);
+
+    /// <summary>
+    ///     Whether the arrivals terminal should be on a planet map.
+    /// </summary>
+    public static readonly CVarDef<bool> ArrivalsPlanet =
+        CVarDef.Create("shuttle.arrivals_planet", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Whether the arrivals shuttle is enabled.
+    /// </summary>
+    public static readonly CVarDef<bool> ArrivalsShuttles =
+        CVarDef.Create("shuttle.arrivals", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     The map to use for the arrivals station.
+    /// </summary>
+    public static readonly CVarDef<string> ArrivalsMap =
+        CVarDef.Create("shuttle.arrivals_map", "/Maps/Misc/terminal.yml", CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Cooldown between arrivals departures. This should be longer than the FTL time or it will double cycle.
+    /// </summary>
+    public static readonly CVarDef<float> ArrivalsCooldown =
+        CVarDef.Create("shuttle.arrivals_cooldown", 50f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Are players allowed to return on the arrivals shuttle.
+    /// </summary>
+    public static readonly CVarDef<bool> ArrivalsReturns =
+        CVarDef.Create("shuttle.arrivals_returns", false, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Should all players who spawn at arrivals have godmode until they leave the map?
+    /// </summary>
+    public static readonly CVarDef<bool> GodmodeArrivals =
+        CVarDef.Create("shuttle.godmode_arrivals", false, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     If a grid is split then hide any smaller ones under this mass (kg) from the map.
+    ///     This is useful to avoid split grids spamming out labels.
+    /// </summary>
+    public static readonly CVarDef<int> HideSplitGridsUnder =
+        CVarDef.Create("shuttle.hide_split_grids_under", 30, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Whether to automatically spawn escape shuttles.
+    /// </summary>
+    public static readonly CVarDef<bool> GridFill =
+        CVarDef.Create("shuttle.grid_fill", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Whether to automatically preloading grids by GridPreloaderSystem
+    /// </summary>
+    public static readonly CVarDef<bool> PreloadGrids =
+        CVarDef.Create("shuttle.preload_grids", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     How long the warmup time before FTL start should be.
+    /// </summary>
+    public static readonly CVarDef<float> FTLStartupTime =
+        CVarDef.Create("shuttle.startup_time", 5.5f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     How long a shuttle spends in FTL.
+    /// </summary>
+    public static readonly CVarDef<float> FTLTravelTime =
+        CVarDef.Create("shuttle.travel_time", 20f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     How long the final stage of FTL before arrival should be.
+    /// </summary>
+    public static readonly CVarDef<float> FTLArrivalTime =
+        CVarDef.Create("shuttle.arrival_time", 5f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     How much time needs to pass before a shuttle can FTL again.
+    /// </summary>
+    public static readonly CVarDef<float> FTLCooldown =
+        CVarDef.Create("shuttle.cooldown", 10f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     The maximum <see cref="PhysicsComponent.Mass"/> a grid can have before it becomes unable to FTL.
+    ///     Any value equal to or less than zero will disable this check.
+    /// </summary>
+    public static readonly CVarDef<float> FTLMassLimit =
+        CVarDef.Create("shuttle.mass_limit", 300f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     How long to knock down entities for if they aren't buckled when FTL starts and stops.
+    /// </summary>
+    public static readonly CVarDef<float> HyperspaceKnockdownTime =
+        CVarDef.Create("shuttle.hyperspace_knockdown_time", 5f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Is the emergency shuttle allowed to be early launched.
+    /// </summary>
+    public static readonly CVarDef<bool> EmergencyEarlyLaunchAllowed =
+        CVarDef.Create("shuttle.emergency_early_launch_allowed", false, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     How long the emergency shuttle remains docked with the station, in seconds.
+    /// </summary>
+    public static readonly CVarDef<float> EmergencyShuttleDockTime =
+        CVarDef.Create("shuttle.emergency_dock_time", 180f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     If the emergency shuttle can't dock at a priority port, the dock time will be multiplied with this value.
+    /// </summary>
+    public static readonly CVarDef<float> EmergencyShuttleDockTimeMultiplierOtherDock =
+        CVarDef.Create("shuttle.emergency_dock_time_multiplier_other_dock", 1.6667f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     If the emergency shuttle can't dock at all, the dock time will be multiplied with this value.
+    /// </summary>
+    public static readonly CVarDef<float> EmergencyShuttleDockTimeMultiplierNoDock =
+        CVarDef.Create("shuttle.emergency_dock_time_multiplier_no_dock", 2f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     How long after the console is authorized for the shuttle to early launch.
+    /// </summary>
+    public static readonly CVarDef<float> EmergencyShuttleAuthorizeTime =
+        CVarDef.Create("shuttle.emergency_authorize_time", 10f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     The minimum time for the emergency shuttle to arrive at centcomm.
+    ///     Actual minimum travel time cannot be less than <see cref="ShuttleSystem.DefaultArrivalTime"/>
+    /// </summary>
+    public static readonly CVarDef<float> EmergencyShuttleMinTransitTime =
+        CVarDef.Create("shuttle.emergency_transit_time_min", 60f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     The maximum time for the emergency shuttle to arrive at centcomm.
+    /// </summary>
+    public static readonly CVarDef<float> EmergencyShuttleMaxTransitTime =
+        CVarDef.Create("shuttle.emergency_transit_time_max", 180f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Whether the emergency shuttle is enabled or should the round just end.
+    /// </summary>
+    public static readonly CVarDef<bool> EmergencyShuttleEnabled =
+        CVarDef.Create("shuttle.emergency", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     The percentage of time passed from the initial call to when the shuttle can no longer be recalled.
+    ///     ex. a call time of 10min and turning point of 0.5 means the shuttle cannot be recalled after 5 minutes.
+    /// </summary>
+    public static readonly CVarDef<float> EmergencyRecallTurningPoint =
+        CVarDef.Create("shuttle.recall_turning_point", 0.5f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Time in minutes after round start to auto-call the shuttle. Set to zero to disable.
+    /// </summary>
+    public static readonly CVarDef<int> EmergencyShuttleAutoCallTime =
+        CVarDef.Create("shuttle.auto_call_time", 90, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Time in minutes after the round was extended (by recalling the shuttle) to call
+    ///     the shuttle again.
+    /// </summary>
+    public static readonly CVarDef<int> EmergencyShuttleAutoCallExtensionTime =
+        CVarDef.Create("shuttle.auto_call_extension_time", 45, CVar.SERVERONLY);
+}
diff --git a/Content.Shared/CCVar/CCVars.Sounds.cs b/Content.Shared/CCVar/CCVars.Sounds.cs
new file mode 100644 (file)
index 0000000..73d9d38
--- /dev/null
@@ -0,0 +1,34 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    public static readonly CVarDef<bool> LobbyMusicEnabled =
+        CVarDef.Create("ambience.lobby_music_enabled", true, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+    public static readonly CVarDef<bool> EventMusicEnabled =
+        CVarDef.Create("ambience.event_music_enabled", true, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+    /// <summary>
+    ///     Round end sound (APC Destroyed)
+    /// </summary>
+    public static readonly CVarDef<bool> RestartSoundsEnabled =
+        CVarDef.Create("ambience.restart_sounds_enabled", true, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+
+
+    public static readonly CVarDef<bool> AdminSoundsEnabled =
+        CVarDef.Create("audio.admin_sounds_enabled", true, CVar.ARCHIVE | CVar.CLIENTONLY);
+
+    public static readonly CVarDef<string> AdminChatSoundPath =
+        CVarDef.Create("audio.admin_chat_sound_path",
+            "/Audio/Items/pop.ogg",
+            CVar.ARCHIVE | CVar.CLIENT | CVar.REPLICATED);
+
+    public static readonly CVarDef<float> AdminChatSoundVolume =
+        CVarDef.Create("audio.admin_chat_sound_volume", -5f, CVar.ARCHIVE | CVar.CLIENT | CVar.REPLICATED);
+
+    public static readonly CVarDef<string> AHelpSound =
+        CVarDef.Create("audio.ahelp_sound", "/Audio/Effects/adminhelp.ogg", CVar.ARCHIVE | CVar.CLIENTONLY);
+}
diff --git a/Content.Shared/CCVar/CCVars.Status.cs b/Content.Shared/CCVar/CCVars.Status.cs
new file mode 100644 (file)
index 0000000..007f678
--- /dev/null
@@ -0,0 +1,13 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    public static readonly CVarDef<string> StatusMoMMIUrl =
+        CVarDef.Create("status.mommiurl", "", CVar.SERVERONLY);
+
+    public static readonly CVarDef<string> StatusMoMMIPassword =
+        CVarDef.Create("status.mommipassword", "", CVar.SERVERONLY | CVar.CONFIDENTIAL);
+
+}
diff --git a/Content.Shared/CCVar/CCVars.Tips.cs b/Content.Shared/CCVar/CCVars.Tips.cs
new file mode 100644 (file)
index 0000000..61e6342
--- /dev/null
@@ -0,0 +1,40 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /// <summary>
+    ///     Whether tips being shown is enabled at all.
+    /// </summary>
+    public static readonly CVarDef<bool> TipsEnabled =
+        CVarDef.Create("tips.enabled", true);
+
+    /// <summary>
+    ///     The dataset prototype to use when selecting a random tip.
+    /// </summary>
+    public static readonly CVarDef<string> TipsDataset =
+        CVarDef.Create("tips.dataset", "Tips");
+
+    /// <summary>
+    ///     The number of seconds between each tip being displayed when the round is not actively going
+    ///     (i.e. postround or lobby)
+    /// </summary>
+    public static readonly CVarDef<float> TipFrequencyOutOfRound =
+        CVarDef.Create("tips.out_of_game_frequency", 60f * 1.5f);
+
+    /// <summary>
+    ///     The number of seconds between each tip being displayed when the round is actively going
+    /// </summary>
+    public static readonly CVarDef<float> TipFrequencyInRound =
+        CVarDef.Create("tips.in_game_frequency", 60f * 60);
+
+    public static readonly CVarDef<string> LoginTipsDataset =
+        CVarDef.Create("tips.login_dataset", "Tips");
+
+    /// <summary>
+    ///     The chance for Tippy to replace a normal tip message.
+    /// </summary>
+    public static readonly CVarDef<float> TipsTippyChance =
+        CVarDef.Create("tips.tippy_chance", 0.01f);
+}
diff --git a/Content.Shared/CCVar/CCVars.Viewport.cs b/Content.Shared/CCVar/CCVars.Viewport.cs
new file mode 100644 (file)
index 0000000..d94394d
--- /dev/null
@@ -0,0 +1,33 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    public static readonly CVarDef<bool> ViewportStretch =
+        CVarDef.Create("viewport.stretch", true, CVar.CLIENTONLY | CVar.ARCHIVE);
+
+    public static readonly CVarDef<int> ViewportFixedScaleFactor =
+        CVarDef.Create("viewport.fixed_scale_factor", 2, CVar.CLIENTONLY | CVar.ARCHIVE);
+
+    public static readonly CVarDef<int> ViewportSnapToleranceMargin =
+        CVarDef.Create("viewport.snap_tolerance_margin", 64, CVar.CLIENTONLY | CVar.ARCHIVE);
+
+    public static readonly CVarDef<int> ViewportSnapToleranceClip =
+        CVarDef.Create("viewport.snap_tolerance_clip", 32, CVar.CLIENTONLY | CVar.ARCHIVE);
+
+    public static readonly CVarDef<bool> ViewportScaleRender =
+        CVarDef.Create("viewport.scale_render", true, CVar.CLIENTONLY | CVar.ARCHIVE);
+
+    public static readonly CVarDef<int> ViewportMinimumWidth =
+        CVarDef.Create("viewport.minimum_width", 15, CVar.REPLICATED | CVar.SERVER);
+
+    public static readonly CVarDef<int> ViewportMaximumWidth =
+        CVarDef.Create("viewport.maximum_width", 21, CVar.REPLICATED | CVar.SERVER);
+
+    public static readonly CVarDef<int> ViewportWidth =
+        CVarDef.Create("viewport.width", 21, CVar.CLIENTONLY | CVar.ARCHIVE);
+
+    public static readonly CVarDef<bool> ViewportVerticalFit =
+        CVarDef.Create("viewport.vertical_fit", true, CVar.CLIENTONLY | CVar.ARCHIVE);
+}
diff --git a/Content.Shared/CCVar/CCVars.Vote.cs b/Content.Shared/CCVar/CCVars.Vote.cs
new file mode 100644 (file)
index 0000000..ee9fee7
--- /dev/null
@@ -0,0 +1,180 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /// <summary>
+    ///     Allows enabling/disabling player-started votes for ultimate authority
+    /// </summary>
+    public static readonly CVarDef<bool> VoteEnabled =
+        CVarDef.Create("vote.enabled", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     See vote.enabled, but specific to restart votes
+    /// </summary>
+    public static readonly CVarDef<bool> VoteRestartEnabled =
+        CVarDef.Create("vote.restart_enabled", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Config for when the restart vote should be allowed to be called regardless with less than this amount of players.
+    /// </summary>
+    public static readonly CVarDef<int> VoteRestartMaxPlayers =
+        CVarDef.Create("vote.restart_max_players", 20, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Config for when the restart vote should be allowed to be called based on percentage of ghosts.
+    /// </summary>
+    public static readonly CVarDef<int> VoteRestartGhostPercentage =
+        CVarDef.Create("vote.restart_ghost_percentage", 55, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     See vote.enabled, but specific to preset votes
+    /// </summary>
+    public static readonly CVarDef<bool> VotePresetEnabled =
+        CVarDef.Create("vote.preset_enabled", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     See vote.enabled, but specific to map votes
+    /// </summary>
+    public static readonly CVarDef<bool> VoteMapEnabled =
+        CVarDef.Create("vote.map_enabled", false, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     The required ratio of the server that must agree for a restart round vote to go through.
+    /// </summary>
+    public static readonly CVarDef<float> VoteRestartRequiredRatio =
+        CVarDef.Create("vote.restart_required_ratio", 0.85f, CVar.SERVERONLY);
+
+    /// <summary>
+    /// Whether or not to prevent the restart vote from having any effect when there is an online admin
+    /// </summary>
+    public static readonly CVarDef<bool> VoteRestartNotAllowedWhenAdminOnline =
+        CVarDef.Create("vote.restart_not_allowed_when_admin_online", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     The delay which two votes of the same type are allowed to be made by separate people, in seconds.
+    /// </summary>
+    public static readonly CVarDef<float> VoteSameTypeTimeout =
+        CVarDef.Create("vote.same_type_timeout", 240f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Sets the duration of the map vote timer.
+    /// </summary>
+    public static readonly CVarDef<int>
+        VoteTimerMap = CVarDef.Create("vote.timermap", 90, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Sets the duration of the restart vote timer.
+    /// </summary>
+    public static readonly CVarDef<int>
+        VoteTimerRestart = CVarDef.Create("vote.timerrestart", 60, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Sets the duration of the gamemode/preset vote timer.
+    /// </summary>
+    public static readonly CVarDef<int>
+        VoteTimerPreset = CVarDef.Create("vote.timerpreset", 30, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Sets the duration of the map vote timer when ALONE.
+    /// </summary>
+    public static readonly CVarDef<int>
+        VoteTimerAlone = CVarDef.Create("vote.timeralone", 10, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Allows enabling/disabling player-started votekick for ultimate authority
+    /// </summary>
+    public static readonly CVarDef<bool> VotekickEnabled =
+        CVarDef.Create("votekick.enabled", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Config for when the votekick should be allowed to be called based on number of eligible voters.
+    /// </summary>
+    public static readonly CVarDef<int> VotekickEligibleNumberRequirement =
+        CVarDef.Create("votekick.eligible_number", 5, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Whether a votekick initiator must be a ghost or not.
+    /// </summary>
+    public static readonly CVarDef<bool> VotekickInitiatorGhostRequirement =
+        CVarDef.Create("votekick.initiator_ghost_requirement", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Should the initiator be whitelisted to initiate a votekick?
+    /// </summary>
+    public static readonly CVarDef<bool> VotekickInitiatorWhitelistedRequirement =
+        CVarDef.Create("votekick.initiator_whitelist_requirement", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Should the initiator be able to start a votekick if they are bellow the votekick.voter_playtime requirement?
+    /// </summary>
+    public static readonly CVarDef<bool> VotekickInitiatorTimeRequirement =
+        CVarDef.Create("votekick.initiator_time_requirement", false, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Whether a votekick voter must be a ghost or not.
+    /// </summary>
+    public static readonly CVarDef<bool> VotekickVoterGhostRequirement =
+        CVarDef.Create("votekick.voter_ghost_requirement", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Config for how many hours playtime a player must have to be able to vote on a votekick.
+    /// </summary>
+    public static readonly CVarDef<int> VotekickEligibleVoterPlaytime =
+        CVarDef.Create("votekick.voter_playtime", 100, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Config for how many seconds a player must have been dead to initiate a votekick / be able to vote on a votekick.
+    /// </summary>
+    public static readonly CVarDef<int> VotekickEligibleVoterDeathtime =
+        CVarDef.Create("votekick.voter_deathtime", 30, CVar.REPLICATED | CVar.SERVER);
+
+    /// <summary>
+    ///     The required ratio of eligible voters that must agree for a votekick to go through.
+    /// </summary>
+    public static readonly CVarDef<float> VotekickRequiredRatio =
+        CVarDef.Create("votekick.required_ratio", 0.6f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Whether or not to prevent the votekick from having any effect when there is an online admin.
+    /// </summary>
+    public static readonly CVarDef<bool> VotekickNotAllowedWhenAdminOnline =
+        CVarDef.Create("votekick.not_allowed_when_admin_online", true, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     The delay for which two votekicks are allowed to be made by separate people, in seconds.
+    /// </summary>
+    public static readonly CVarDef<float> VotekickTimeout =
+        CVarDef.Create("votekick.timeout", 120f, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Sets the duration of the votekick vote timer.
+    /// </summary>
+    public static readonly CVarDef<int>
+        VotekickTimer = CVarDef.Create("votekick.timer", 60, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Config for how many hours playtime a player must have to get protection from the Raider votekick type when playing as an antag.
+    /// </summary>
+    public static readonly CVarDef<int> VotekickAntagRaiderProtection =
+        CVarDef.Create("votekick.antag_raider_protection", 10, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Default severity for votekick bans
+    /// </summary>
+    public static readonly CVarDef<string> VotekickBanDefaultSeverity =
+        CVarDef.Create("votekick.ban_default_severity", "High", CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED);
+
+    /// <summary>
+    ///     Duration of a ban caused by a votekick (in minutes).
+    /// </summary>
+    public static readonly CVarDef<int> VotekickBanDuration =
+        CVarDef.Create("votekick.ban_duration", 180, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Whether the ghost requirement settings for votekicks should be ignored for the lobby.
+    /// </summary>
+    public static readonly CVarDef<bool> VotekickIgnoreGhostReqInLobby =
+        CVarDef.Create("votekick.ignore_ghost_req_in_lobby", true, CVar.SERVERONLY);
+}
diff --git a/Content.Shared/CCVar/CCVars.Whitelist.cs b/Content.Shared/CCVar/CCVars.Whitelist.cs
new file mode 100644 (file)
index 0000000..7a7a520
--- /dev/null
@@ -0,0 +1,19 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /// <summary>
+    ///     Controls whether the server will deny any players that are not whitelisted in the DB.
+    /// </summary>
+    public static readonly CVarDef<bool> WhitelistEnabled =
+        CVarDef.Create("whitelist.enabled", false, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     Specifies the whitelist prototypes to be used by the server. This should be a comma-separated list of prototypes.
+    ///     If a whitelists conditions to be active fail (for example player count), the next whitelist will be used instead. If no whitelist is valid, the player will be allowed to connect.
+    /// </summary>
+    public static readonly CVarDef<string> WhitelistPrototypeList =
+        CVarDef.Create("whitelist.prototype_list", "basicWhitelist", CVar.SERVERONLY);
+}
diff --git a/Content.Shared/CCVar/CCVars.Worldgen.cs b/Content.Shared/CCVar/CCVars.Worldgen.cs
new file mode 100644 (file)
index 0000000..da165ce
--- /dev/null
@@ -0,0 +1,18 @@
+using Robust.Shared.Configuration;
+
+namespace Content.Shared.CCVar;
+
+public sealed partial class CCVars
+{
+    /// <summary>
+    ///     Whether or not world generation is enabled.
+    /// </summary>
+    public static readonly CVarDef<bool> WorldgenEnabled =
+        CVarDef.Create("worldgen.enabled", false, CVar.SERVERONLY);
+
+    /// <summary>
+    ///     The worldgen config to use.
+    /// </summary>
+    public static readonly CVarDef<string> WorldgenConfig =
+        CVarDef.Create("worldgen.worldgen_config", "Default", CVar.SERVERONLY);
+}
index 83068b5262bc6c4b3800d536f1852fbe80651ed1..316d9b8690a887fc835b17bbfba776b23c8aefc3 100644 (file)
-using Content.Shared.Maps;
-using Content.Shared.Roles;
 using Robust.Shared;
 using Robust.Shared.Configuration;
-using Robust.Shared.Physics.Components;
 
-namespace Content.Shared.CCVar
-{
-    // ReSharper disable once InconsistentNaming
-    [CVarDefs]
-    public sealed class CCVars : CVars
-    {
-        /*
-         * Server
-         */
-
-        /// <summary>
-        ///     Change this to have the changelog and rules "last seen" date stored separately.
-        /// </summary>
-        public static readonly CVarDef<string> ServerId =
-            CVarDef.Create("server.id", "unknown_server_id", CVar.REPLICATED | CVar.SERVER);
-
-        /// <summary>
-        ///     Guide Entry Prototype ID to be displayed as the server rules.
-        /// </summary>
-        public static readonly CVarDef<string> RulesFile =
-            CVarDef.Create("server.rules_file", "DefaultRuleset", CVar.REPLICATED | CVar.SERVER);
-
-        /// <summary>
-        ///     Guide entry that is displayed by default when a guide is opened.
-        /// </summary>
-        public static readonly CVarDef<string> DefaultGuide =
-            CVarDef.Create("server.default_guide", "NewPlayer", CVar.REPLICATED | CVar.SERVER);
-
-        /// <summary>
-        /// If greater than 0, automatically restart the server after this many minutes of uptime.
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// This is intended to work around various bugs and performance issues caused by long continuous server uptime.
-        /// </para>
-        /// <para>
-        /// This uses the same non-disruptive logic as update restarts,
-        /// i.e. the game will only restart at round end or when there is nobody connected.
-        /// </para>
-        /// </remarks>
-        public static readonly CVarDef<int> ServerUptimeRestartMinutes =
-            CVarDef.Create("server.uptime_restart_minutes", 0, CVar.SERVERONLY);
-
-        /*
-         * Ambience
-         */
-
-        /// <summary>
-        /// 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.
-        /// </summary>
-        public static readonly CVarDef<float> AmbientCooldown =
-            CVarDef.Create("ambience.cooldown", 0.1f, CVar.ARCHIVE | CVar.CLIENTONLY);
-
-        /// <summary>
-        /// How large of a range to sample for ambience.
-        /// </summary>
-        public static readonly CVarDef<float> AmbientRange =
-            CVarDef.Create("ambience.range", 8f, CVar.REPLICATED | CVar.SERVER);
-
-        /// <summary>
-        /// Maximum simultaneous ambient sounds.
-        /// </summary>
-        public static readonly CVarDef<int> MaxAmbientSources =
-            CVarDef.Create("ambience.max_sounds", 16, CVar.ARCHIVE | CVar.CLIENTONLY);
-
-        /// <summary>
-        /// The minimum value the user can set for ambience.max_sounds
-        /// </summary>
-        public static readonly CVarDef<int> MinMaxAmbientSourcesConfigured =
-            CVarDef.Create("ambience.min_max_sounds_configured", 16, CVar.REPLICATED | CVar.SERVER | CVar.CHEAT);
-
-        /// <summary>
-        /// The maximum value the user can set for ambience.max_sounds
-        /// </summary>
-        public static readonly CVarDef<int> MaxMaxAmbientSourcesConfigured =
-            CVarDef.Create("ambience.max_max_sounds_configured", 64, CVar.REPLICATED | CVar.SERVER | CVar.CHEAT);
-
-        /// <summary>
-        /// Ambience volume.
-        /// </summary>
-        public static readonly CVarDef<float> AmbienceVolume =
-            CVarDef.Create("ambience.volume", 1.5f, CVar.ARCHIVE | CVar.CLIENTONLY);
-
-        /// <summary>
-        /// Ambience music volume.
-        /// </summary>
-        public static readonly CVarDef<float> AmbientMusicVolume =
-            CVarDef.Create("ambience.music_volume", 1.5f, CVar.ARCHIVE | CVar.CLIENTONLY);
-
-        /// <summary>
-        /// Lobby / round end music volume.
-        /// </summary>
-        public static readonly CVarDef<float> LobbyMusicVolume =
-            CVarDef.Create("ambience.lobby_music_volume", 0.50f, CVar.ARCHIVE | CVar.CLIENTONLY);
-
-        /// <summary>
-        /// UI volume.
-        /// </summary>
-        public static readonly CVarDef<float> InterfaceVolume =
-            CVarDef.Create("audio.interface_volume", 0.50f, CVar.ARCHIVE | CVar.CLIENTONLY);
-
-        /*
-         * Status
-         */
-
-        public static readonly CVarDef<string> StatusMoMMIUrl =
-            CVarDef.Create("status.mommiurl", "", CVar.SERVERONLY);
-
-        public static readonly CVarDef<string> StatusMoMMIPassword =
-            CVarDef.Create("status.mommipassword", "", CVar.SERVERONLY | CVar.CONFIDENTIAL);
-
-        /*
-         * Events
-         */
-
-        /// <summary>
-        ///     Controls if the game should run station events
-        /// </summary>
-        public static readonly CVarDef<bool>
-            EventsEnabled = CVarDef.Create("events.enabled", true, CVar.ARCHIVE | CVar.SERVERONLY);
-
-        /*
-         * Game
-         */
-
-        /// <summary>
-        ///     Disables most functionality in the GameTicker.
-        /// </summary>
-        public static readonly CVarDef<bool>
-            GameDummyTicker = CVarDef.Create("game.dummyticker", false, CVar.ARCHIVE | CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Controls if the lobby is enabled. If it is not, and there are no available jobs, you may get stuck on a black screen.
-        /// </summary>
-        public static readonly CVarDef<bool>
-            GameLobbyEnabled = CVarDef.Create("game.lobbyenabled", true, CVar.ARCHIVE);
-
-        /// <summary>
-        ///     Controls the duration of the lobby timer in seconds. Defaults to 2 minutes and 30 seconds.
-        /// </summary>
-        public static readonly CVarDef<int>
-            GameLobbyDuration = CVarDef.Create("game.lobbyduration", 150, CVar.ARCHIVE);
-
-        /// <summary>
-        ///     Controls if players can latejoin at all.
-        /// </summary>
-        public static readonly CVarDef<bool>
-            GameDisallowLateJoins = CVarDef.Create("game.disallowlatejoins", false, CVar.ARCHIVE | CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Controls the default game preset.
-        /// </summary>
-        public static readonly CVarDef<string>
-            GameLobbyDefaultPreset = CVarDef.Create("game.defaultpreset", "secret", CVar.ARCHIVE);
-
-        /// <summary>
-        ///     Controls if the game can force a different preset if the current preset's criteria are not met.
-        /// </summary>
-        public static readonly CVarDef<bool>
-            GameLobbyFallbackEnabled = CVarDef.Create("game.fallbackenabled", true, CVar.ARCHIVE);
-
-        /// <summary>
-        ///     The preset for the game to fall back to if the selected preset could not be used, and fallback is enabled.
-        /// </summary>
-        public static readonly CVarDef<string>
-            GameLobbyFallbackPreset = CVarDef.Create("game.fallbackpreset", "Traitor,Extended", CVar.ARCHIVE);
-
-        /// <summary>
-        ///     Controls if people can win the game in Suspicion or Deathmatch.
-        /// </summary>
-        public static readonly CVarDef<bool>
-            GameLobbyEnableWin = CVarDef.Create("game.enablewin", true, CVar.ARCHIVE);
-
-        /// <summary>
-        ///     Controls the maximum number of character slots a player is allowed to have.
-        /// </summary>
-        public static readonly CVarDef<int>
-            GameMaxCharacterSlots = CVarDef.Create("game.maxcharacterslots", 30, CVar.ARCHIVE | CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Controls the game map prototype to load. SS14 stores these prototypes in Prototypes/Maps.
-        /// </summary>
-        public static readonly CVarDef<string>
-            GameMap = CVarDef.Create("game.map", string.Empty, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Controls whether to use world persistence or not.
-        /// </summary>
-        public static readonly CVarDef<bool>
-            UsePersistence = CVarDef.Create("game.usepersistence", false, CVar.ARCHIVE);
-
-        /// <summary>
-        ///     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).
-        /// </summary>
-        public static readonly CVarDef<string>
-            PersistenceMap = CVarDef.Create("game.persistencemap", "Empty", CVar.ARCHIVE);
-
-        /// <summary>
-        ///     Prototype to use for map pool.
-        /// </summary>
-        public static readonly CVarDef<string>
-            GameMapPool = CVarDef.Create("game.map_pool", "DefaultMapPool", CVar.SERVERONLY);
-
-        /// <summary>
-        /// 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.
-        /// </summary>
-        public static readonly CVarDef<int>
-            GameMapMemoryDepth = CVarDef.Create("game.map_memory_depth", 16, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Is map rotation enabled?
-        /// </summary>
-        public static readonly CVarDef<bool>
-            GameMapRotation = CVarDef.Create("game.map_rotation", true, CVar.SERVERONLY);
-
-        /// <summary>
-        /// If roles should be restricted based on time.
-        /// </summary>
-        public static readonly CVarDef<bool>
-            GameRoleTimers = CVarDef.Create("game.role_timers", true, CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        /// Override default role requirements using a <see cref="JobRequirementOverridePrototype"/>
-        /// </summary>
-        public static readonly CVarDef<string>
-            GameRoleTimerOverride = CVarDef.Create("game.role_timer_override", "", CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        /// If roles should be restricted based on whether or not they are whitelisted.
-        /// </summary>
-        public static readonly CVarDef<bool>
-            GameRoleWhitelist = CVarDef.Create("game.role_whitelist", true, CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        /// Whether or not disconnecting inside of a cryopod should remove the character or just store them until they reconnect.
-        /// </summary>
-        public static readonly CVarDef<bool>
-            GameCryoSleepRejoining = CVarDef.Create("game.cryo_sleep_rejoining", false, CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        ///     When enabled, guests will be assigned permanent UIDs and will have their preferences stored.
-        /// </summary>
-        public static readonly CVarDef<bool> GamePersistGuests =
-            CVarDef.Create("game.persistguests", true, CVar.ARCHIVE | CVar.SERVERONLY);
-
-        public static readonly CVarDef<bool> GameDiagonalMovement =
-            CVarDef.Create("game.diagonalmovement", true, CVar.ARCHIVE);
-
-        public static readonly CVarDef<int> SoftMaxPlayers =
-            CVarDef.Create("game.soft_max_players", 30, CVar.SERVERONLY | CVar.ARCHIVE);
-
-        /// <summary>
-        /// If a player gets denied connection to the server,
-        /// how long they are forced to wait before attempting to reconnect.
-        /// </summary>
-        public static readonly CVarDef<int> GameServerFullReconnectDelay =
-            CVarDef.Create("game.server_full_reconnect_delay", 30, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Whether or not panic bunker is currently enabled.
-        /// </summary>
-        public static readonly CVarDef<bool> PanicBunkerEnabled =
-            CVarDef.Create("game.panic_bunker.enabled", false, CVar.NOTIFY | CVar.REPLICATED | CVar.SERVER);
-
-        /// <summary>
-        /// Whether or not the panic bunker will disable when an admin comes online.
-        /// </summary>
-        public static readonly CVarDef<bool> PanicBunkerDisableWithAdmins =
-            CVarDef.Create("game.panic_bunker.disable_with_admins", false, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Whether or not the panic bunker will enable when no admins are online.
-        /// </summary>
-        public static readonly CVarDef<bool> PanicBunkerEnableWithoutAdmins =
-            CVarDef.Create("game.panic_bunker.enable_without_admins", false, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Whether or not the panic bunker will count deadminned admins for
-        /// <see cref="PanicBunkerDisableWithAdmins"/> and
-        /// <see cref="PanicBunkerEnableWithoutAdmins"/>
-        /// </summary>
-        public static readonly CVarDef<bool> PanicBunkerCountDeadminnedAdmins =
-            CVarDef.Create("game.panic_bunker.count_deadminned_admins", false, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Show reason of disconnect for user or not.
-        /// </summary>
-        public static readonly CVarDef<bool> PanicBunkerShowReason =
-            CVarDef.Create("game.panic_bunker.show_reason", false, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Minimum age of the account (from server's PoV, so from first-seen date) in minutes.
-        /// </summary>
-        public static readonly CVarDef<int> PanicBunkerMinAccountAge =
-            CVarDef.Create("game.panic_bunker.min_account_age", 1440, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Minimal overall played time.
-        /// </summary>
-        public static readonly CVarDef<int> PanicBunkerMinOverallMinutes =
-            CVarDef.Create("game.panic_bunker.min_overall_minutes", 600, CVar.SERVERONLY);
-
-        /// <summary>
-        /// A custom message that will be used for connections denied to the panic bunker
-        /// If not empty, then will overwrite <see cref="PanicBunkerShowReason"/>
-        /// </summary>
-        public static readonly CVarDef<string> PanicBunkerCustomReason =
-            CVarDef.Create("game.panic_bunker.custom_reason", string.Empty, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Allow bypassing the panic bunker if the user is whitelisted.
-        /// </summary>
-        public static readonly CVarDef<bool> 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.
-         */
-
-        /// <summary>
-        /// Whether the baby jail is currently enabled.
-        /// </summary>
-        public static readonly CVarDef<bool> BabyJailEnabled  =
-            CVarDef.Create("game.baby_jail.enabled", false, CVar.NOTIFY | CVar.REPLICATED | CVar.SERVER);
-
-        /// <summary>
-        /// Show reason of disconnect for user or not.
-        /// </summary>
-        public static readonly CVarDef<bool> BabyJailShowReason =
-            CVarDef.Create("game.baby_jail.show_reason", false, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Maximum age of the account (from server's PoV, so from first-seen date) in minutes that can access baby
-        /// jailed servers.
-        /// </summary>
-        public static readonly CVarDef<int> BabyJailMaxAccountAge =
-            CVarDef.Create("game.baby_jail.max_account_age", 1440, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Maximum overall played time allowed to access baby jailed servers.
-        /// </summary>
-        public static readonly CVarDef<int> BabyJailMaxOverallMinutes =
-            CVarDef.Create("game.baby_jail.max_overall_minutes", 120, CVar.SERVERONLY);
-
-        /// <summary>
-        /// A custom message that will be used for connections denied due to the baby jail.
-        /// If not empty, then will overwrite <see cref="BabyJailShowReason"/>
-        /// </summary>
-        public static readonly CVarDef<string> BabyJailCustomReason =
-            CVarDef.Create("game.baby_jail.custom_reason", string.Empty, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Allow bypassing the baby jail if the user is whitelisted.
-        /// </summary>
-        public static readonly CVarDef<bool> BypassBabyJailWhitelist =
-            CVarDef.Create("game.baby_jail.whitelisted_can_bypass", true, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Make people bonk when trying to climb certain objects like tables.
-        /// </summary>
-        public static readonly CVarDef<bool> GameTableBonk =
-            CVarDef.Create("game.table_bonk", false, CVar.REPLICATED);
-
-        /// <summary>
-        /// Whether or not status icons are rendered for everyone.
-        /// </summary>
-        public static readonly CVarDef<bool> GlobalStatusIconsEnabled =
-            CVarDef.Create("game.global_status_icons_enabled", true, CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        /// Whether or not status icons are rendered on this specific client.
-        /// </summary>
-        public static readonly CVarDef<bool> LocalStatusIconsEnabled =
-            CVarDef.Create("game.local_status_icons_enabled", true, CVar.CLIENTONLY);
-
-        /// <summary>
-        /// Whether or not coordinates on the Debug overlay should only be available to admins.
-        /// </summary>
-        public static readonly CVarDef<bool> DebugCoordinatesAdminOnly =
-            CVarDef.Create("game.debug_coordinates_admin_only", true, CVar.SERVER | CVar.REPLICATED);
-
-#if EXCEPTION_TOLERANCE
-        /// <summary>
-        ///     Amount of times round start must fail before the server is shut down.
-        ///     Set to 0 or a negative number to disable.
-        /// </summary>
-        public static readonly CVarDef<int> RoundStartFailShutdownCount =
-            CVarDef.Create("game.round_start_fail_shutdown_count", 5, CVar.SERVERONLY | CVar.SERVER);
-#endif
-
-        /// <summary>
-        /// Delay between station alert level changes.
-        /// </summary>
-        public static readonly CVarDef<int> GameAlertLevelChangeDelay =
-            CVarDef.Create("game.alert_level_change_delay", 30, CVar.SERVERONLY);
-
-        /// <summary>
-        /// The time in seconds that the server should wait before restarting the round.
-        /// Defaults to 2 minutes.
-        /// </summary>
-        public static readonly CVarDef<float> RoundRestartTime =
-            CVarDef.Create("game.round_restart_time", 120f, CVar.SERVERONLY);
-
-        /// <summary>
-        /// The prototype to use for secret weights.
-        /// </summary>
-        public static readonly CVarDef<string> SecretWeightPrototype =
-            CVarDef.Create("game.secret_weight_prototype", "Secret", CVar.SERVERONLY);
-
-        /// <summary>
-        /// The id of the sound collection to randomly choose a sound from and play when the round ends.
-        /// </summary>
-        public static readonly CVarDef<string> RoundEndSoundCollection =
-            CVarDef.Create("game.round_end_sound_collection", "RoundEnd", CVar.SERVERONLY);
-
-        /// <summary>
-        /// 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.
-        /// </summary>
-        public static readonly CVarDef<bool> RoundEndPVSOverrides =
-            CVarDef.Create("game.round_end_pvs_overrides", true, CVar.SERVERONLY);
-
-        /// <summary>
-        /// If true, players can place objects onto tabletop games like chess boards.
-        /// </summary>
-        /// <remarks>
-        /// This feature is currently highly abusable and can easily be used to crash the server,
-        /// so it's off by default.
-        /// </remarks>
-        public static readonly CVarDef<bool> GameTabletopPlace =
-            CVarDef.Create("game.tabletop_place", false, CVar.SERVERONLY);
-
-        /// <summary>
-        /// If true, contraband severity can be viewed in the examine menu
-        /// </summary>
-        public static readonly CVarDef<bool> ContrabandExamine =
-            CVarDef.Create("game.contraband_examine", true, CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        /// Size of the lookup area for adding entities to the context menu
-        /// </summary>
-        public static readonly CVarDef<float> GameEntityMenuLookup =
-            CVarDef.Create("game.entity_menu_lookup", 0.25f, CVar.CLIENTONLY | CVar.ARCHIVE);
-
-        /// <summary>
-        /// Should the clients window show the server hostname in the title?
-        /// </summary>
-        public static readonly CVarDef<bool> GameHostnameInTitlebar =
-            CVarDef.Create("game.hostname_in_titlebar", true, CVar.SERVER | CVar.REPLICATED);
-
-        /*
-         * Discord
-         */
-
-        /// <summary>
-        /// The role that will get mentioned if a new SOS ahelp comes in.
-        /// </summary>
-        public static readonly CVarDef<string> DiscordAhelpMention =
-        CVarDef.Create("discord.on_call_ping", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL);
-
-        /// <summary>
-        /// URL of the discord webhook to relay unanswered ahelp messages.
-        /// </summary>
-        public static readonly CVarDef<string> DiscordOnCallWebhook =
-            CVarDef.Create("discord.on_call_webhook", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL);
-
-        /// <summary>
-        /// URL of the Discord webhook which will relay all ahelp messages.
-        /// </summary>
-        public static readonly CVarDef<string> DiscordAHelpWebhook =
-            CVarDef.Create("discord.ahelp_webhook", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL);
-
-        /// <summary>
-        /// 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.
-        /// </summary>
-        public static readonly CVarDef<string> DiscordAHelpFooterIcon =
-            CVarDef.Create("discord.ahelp_footer_icon", string.Empty, CVar.SERVERONLY);
-
-        /// <summary>
-        /// The avatar to use for the webhook. Should be an URL.
-        /// </summary>
-        public static readonly CVarDef<string> DiscordAHelpAvatar =
-            CVarDef.Create("discord.ahelp_avatar", string.Empty, CVar.SERVERONLY);
-
-        /// <summary>
-        /// URL of the Discord webhook which will relay all custom votes. If left empty, disables the webhook.
-        /// </summary>
-        public static readonly CVarDef<string> DiscordVoteWebhook =
-            CVarDef.Create("discord.vote_webhook", string.Empty, CVar.SERVERONLY);
-
-        /// <summary>
-        /// URL of the Discord webhook which will relay all votekick votes. If left empty, disables the webhook.
-        /// </summary>
-        public static readonly CVarDef<string> DiscordVotekickWebhook =
-            CVarDef.Create("discord.votekick_webhook", string.Empty, CVar.SERVERONLY);
-
-        /// URL of the Discord webhook which will relay round restart messages.
-        /// </summary>
-        public static readonly CVarDef<string> DiscordRoundUpdateWebhook =
-            CVarDef.Create("discord.round_update_webhook", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL);
-
-        /// <summary>
-        /// Role id for the Discord webhook to ping when the round ends.
-        /// </summary>
-        public static readonly CVarDef<string> DiscordRoundEndRoleWebhook =
-            CVarDef.Create("discord.round_end_role", string.Empty, CVar.SERVERONLY);
-
-        /*
-         * Tips
-         */
-
-        /// <summary>
-        ///     Whether tips being shown is enabled at all.
-        /// </summary>
-        public static readonly CVarDef<bool> TipsEnabled =
-            CVarDef.Create("tips.enabled", true);
-
-        /// <summary>
-        ///     The dataset prototype to use when selecting a random tip.
-        /// </summary>
-        public static readonly CVarDef<string> TipsDataset =
-            CVarDef.Create("tips.dataset", "Tips");
-
-        /// <summary>
-        ///     The number of seconds between each tip being displayed when the round is not actively going
-        ///     (i.e. postround or lobby)
-        /// </summary>
-        public static readonly CVarDef<float> TipFrequencyOutOfRound =
-            CVarDef.Create("tips.out_of_game_frequency", 60f * 1.5f);
-
-        /// <summary>
-        ///     The number of seconds between each tip being displayed when the round is actively going
-        /// </summary>
-        public static readonly CVarDef<float> TipFrequencyInRound =
-            CVarDef.Create("tips.in_game_frequency", 60f * 60);
-
-        public static readonly CVarDef<string> LoginTipsDataset =
-            CVarDef.Create("tips.login_dataset", "Tips");
-
-        /// <summary>
-        ///     The chance for Tippy to replace a normal tip message.
-        /// </summary>
-        public static readonly CVarDef<float> TipsTippyChance =
-            CVarDef.Create("tips.tippy_chance", 0.01f);
-
-        /*
-         * Console
-         */
-
-        public static readonly CVarDef<bool> ConsoleLoginLocal =
-            CVarDef.Create("console.loginlocal", true, CVar.ARCHIVE | CVar.SERVERONLY);
-
-        /// <summary>
-        /// Automatically log in the given user as host, equivalent to the <c>promotehost</c> command.
-        /// </summary>
-        public static readonly CVarDef<string> ConsoleLoginHostUser =
-            CVarDef.Create("console.login_host_user", "", CVar.ARCHIVE | CVar.SERVERONLY);
-
-
-        /*
-         * Database stuff
-         */
-
-        public static readonly CVarDef<string> DatabaseEngine =
-            CVarDef.Create("database.engine", "sqlite", CVar.SERVERONLY);
-
-        public static readonly CVarDef<string> DatabaseSqliteDbPath =
-            CVarDef.Create("database.sqlite_dbpath", "preferences.db", CVar.SERVERONLY);
-
-        /// <summary>
-        /// Milliseconds to asynchronously delay all SQLite database acquisitions with.
-        /// </summary>
-        /// <remarks>
-        /// 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)
-        /// </remarks>
-        public static readonly CVarDef<int> DatabaseSqliteDelay =
-            CVarDef.Create("database.sqlite_delay", DefaultSqliteDelay, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Amount of concurrent SQLite database operations.
-        /// </summary>
-        /// <remarks>
-        /// 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.
-        /// </remarks>
-        public static readonly CVarDef<int> DatabaseSqliteConcurrency =
-            CVarDef.Create("database.sqlite_concurrency", 3, CVar.SERVERONLY);
-
-#if DEBUG
-        private const int DefaultSqliteDelay = 1;
-#else
-        private const int DefaultSqliteDelay = 0;
-#endif
-
-
-        public static readonly CVarDef<string> DatabasePgHost =
-            CVarDef.Create("database.pg_host", "localhost", CVar.SERVERONLY);
-
-        public static readonly CVarDef<int> DatabasePgPort =
-            CVarDef.Create("database.pg_port", 5432, CVar.SERVERONLY);
-
-        public static readonly CVarDef<string> DatabasePgDatabase =
-            CVarDef.Create("database.pg_database", "ss14", CVar.SERVERONLY);
-
-        public static readonly CVarDef<string> DatabasePgUsername =
-            CVarDef.Create("database.pg_username", "postgres", CVar.SERVERONLY);
-
-        public static readonly CVarDef<string> DatabasePgPassword =
-            CVarDef.Create("database.pg_password", "", CVar.SERVERONLY | CVar.CONFIDENTIAL);
-
-        /// <summary>
-        /// Max amount of concurrent Postgres database operations.
-        /// </summary>
-        public static readonly CVarDef<int> DatabasePgConcurrency =
-            CVarDef.Create("database.pg_concurrency", 8, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Milliseconds to asynchronously delay all PostgreSQL database operations with.
-        /// </summary>
-        /// <remarks>
-        /// This is intended for performance testing. It works different from <see cref="DatabaseSqliteDelay"/>,
-        /// as the lag is applied after acquiring the database lock.
-        /// </remarks>
-        public static readonly CVarDef<int> DatabasePgFakeLag =
-            CVarDef.Create("database.pg_fake_lag", 0, CVar.SERVERONLY);
-
-        // Basically only exists for integration tests to avoid race conditions.
-        public static readonly CVarDef<bool> DatabaseSynchronous =
-            CVarDef.Create("database.sync", false, CVar.SERVERONLY);
-
-        /*
-         * Interface
-         */
-
-        public static readonly CVarDef<string> UIClickSound =
-            CVarDef.Create("interface.click_sound", "/Audio/UserInterface/click.ogg", CVar.REPLICATED);
-
-        public static readonly CVarDef<string> UIHoverSound =
-            CVarDef.Create("interface.hover_sound", "/Audio/UserInterface/hover.ogg", CVar.REPLICATED);
-
-        /*
-         * Outline
-         */
-
-        public static readonly CVarDef<bool> OutlineEnabled =
-            CVarDef.Create("outline.enabled", true, CVar.CLIENTONLY);
-
-
-        /*
-         * Parallax
-         */
-
-        public static readonly CVarDef<bool> ParallaxEnabled =
-            CVarDef.Create("parallax.enabled", true, CVar.CLIENTONLY);
-
-        public static readonly CVarDef<bool> ParallaxDebug =
-            CVarDef.Create("parallax.debug", false, CVar.CLIENTONLY);
-
-        public static readonly CVarDef<bool> ParallaxLowQuality =
-            CVarDef.Create("parallax.low_quality", false, CVar.ARCHIVE | CVar.CLIENTONLY);
-
-        /*
-         * Physics
-         */
-
-        /// <summary>
-        /// When a mob is walking should its X / Y movement be relative to its parent (true) or the map (false).
-        /// </summary>
-        public static readonly CVarDef<bool> RelativeMovement =
-            CVarDef.Create("physics.relative_movement", true, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
-
-        public static readonly CVarDef<float> TileFrictionModifier =
-            CVarDef.Create("physics.tile_friction", 40.0f, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
-
-        public static readonly CVarDef<float> StopSpeed =
-            CVarDef.Create("physics.stop_speed", 0.1f, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
-
-        /// <summary>
-        /// Whether mobs can push objects like lockers.
-        /// </summary>
-        /// <remarks>
-        /// Technically client doesn't need to know about it but this may prevent a bug in the distant future so it stays.
-        /// </remarks>
-        public static readonly CVarDef<bool> MobPushing =
-            CVarDef.Create("physics.mob_pushing", false, CVar.REPLICATED | CVar.SERVER);
-
-        /*
-         * Music
-         */
-
-        public static readonly CVarDef<bool> LobbyMusicEnabled =
-            CVarDef.Create("ambience.lobby_music_enabled", true, CVar.ARCHIVE | CVar.CLIENTONLY);
-
-        public static readonly CVarDef<bool> EventMusicEnabled =
-            CVarDef.Create("ambience.event_music_enabled", true, CVar.ARCHIVE | CVar.CLIENTONLY);
-
-        /*
-         * Specific Sounds
-         */
-        // Round  end sound (APC Destroyed)
-        public static readonly CVarDef<bool> RestartSoundsEnabled =
-            CVarDef.Create("ambience.restart_sounds_enabled", true, CVar.ARCHIVE | CVar.CLIENTONLY);
-
-
-        /*
-         * Admin sounds
-         */
-
-        public static readonly CVarDef<bool> AdminSoundsEnabled =
-            CVarDef.Create("audio.admin_sounds_enabled", true, CVar.ARCHIVE | CVar.CLIENTONLY);
-        public static readonly CVarDef<string> AdminChatSoundPath =
-            CVarDef.Create("audio.admin_chat_sound_path", "/Audio/Items/pop.ogg", CVar.ARCHIVE | CVar.CLIENT | CVar.REPLICATED);
-        public static readonly CVarDef<float> AdminChatSoundVolume =
-            CVarDef.Create("audio.admin_chat_sound_volume", -5f, CVar.ARCHIVE | CVar.CLIENT | CVar.REPLICATED);
-        public static readonly CVarDef<string> AHelpSound =
-            CVarDef.Create("audio.ahelp_sound", "/Audio/Effects/adminhelp.ogg", CVar.ARCHIVE | CVar.CLIENTONLY);
-
-        /*
-         * HUD
-         */
-
-        public static readonly CVarDef<int> HudTheme =
-            CVarDef.Create("hud.theme", 0, CVar.ARCHIVE | CVar.CLIENTONLY);
-
-        public static readonly CVarDef<bool> HudHeldItemShow =
-            CVarDef.Create("hud.held_item_show", true, CVar.ARCHIVE | CVar.CLIENTONLY);
-
-        public static readonly CVarDef<bool> CombatModeIndicatorsPointShow =
-            CVarDef.Create("hud.combat_mode_indicators_point_show", true, CVar.ARCHIVE | CVar.CLIENTONLY);
-
-        public static readonly CVarDef<bool> LoocAboveHeadShow =
-            CVarDef.Create("hud.show_looc_above_head", true, CVar.ARCHIVE | CVar.CLIENTONLY);
-
-        public static readonly CVarDef<float> HudHeldItemOffset =
-            CVarDef.Create("hud.held_item_offset", 28f, CVar.ARCHIVE | CVar.CLIENTONLY);
-
-        public static readonly CVarDef<bool> HudFpsCounterVisible =
-            CVarDef.Create("hud.fps_counter_visible", false, CVar.CLIENTONLY | CVar.ARCHIVE);
-
-        /*
-         * NPCs
-         */
-
-        public static readonly CVarDef<int> NPCMaxUpdates =
-            CVarDef.Create("npc.max_updates", 128);
-
-        public static readonly CVarDef<bool> NPCEnabled = CVarDef.Create("npc.enabled", true);
-
-        /// <summary>
-        /// Should NPCs pathfind when steering. For debug purposes.
-        /// </summary>
-        public static readonly CVarDef<bool> NPCPathfinding = CVarDef.Create("npc.pathfinding", true);
-
-        /*
-         * Net
-         */
-
-        public static readonly CVarDef<float> NetAtmosDebugOverlayTickRate =
-            CVarDef.Create("net.atmosdbgoverlaytickrate", 3.0f);
-
-        public static readonly CVarDef<float> NetGasOverlayTickRate =
-            CVarDef.Create("net.gasoverlaytickrate", 3.0f);
-
-        public static readonly CVarDef<int> GasOverlayThresholds =
-            CVarDef.Create("net.gasoverlaythresholds", 20);
-
-        /*
-         * Admin
-         */
-
-        public static readonly CVarDef<bool> AdminAnnounceLogin =
-            CVarDef.Create("admin.announce_login", true, CVar.SERVERONLY);
-
-        public static readonly CVarDef<bool> AdminAnnounceLogout =
-            CVarDef.Create("admin.announce_logout", true, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     The token used to authenticate with the admin API. Leave empty to disable the admin API. This is a secret! Do not share!
-        /// </summary>
-        public static readonly CVarDef<string> AdminApiToken =
-            CVarDef.Create("admin.api_token", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL);
-
-
-        /// <summary>
-        /// Should users be able to see their own notes? Admins will be able to see and set notes regardless
-        /// </summary>
-        public static readonly CVarDef<bool> SeeOwnNotes =
-            CVarDef.Create("admin.see_own_notes", false, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
-
-        /// <summary>
-        /// Should the server play a quick sound to the active admins whenever a new player joins?
-        /// </summary>
-        public static readonly CVarDef<bool> AdminNewPlayerJoinSound =
-            CVarDef.Create("admin.new_player_join_sound", false, CVar.SERVERONLY);
-
-        /// <summary>
-        /// The amount of days before the note starts fading. It will slowly lose opacity until it reaches stale. Set to 0 to disable.
-        /// </summary>
-        public static readonly CVarDef<double> NoteFreshDays =
-            CVarDef.Create("admin.note_fresh_days", 91.31055, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
-
-        /// <summary>
-        /// 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.
-        /// </summary>
-        public static readonly CVarDef<double> NoteStaleDays =
-            CVarDef.Create("admin.note_stale_days", 365.2422, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
-
-        /// <summary>
-        /// How much time does the user have to wait in seconds before confirming that they saw an admin message?
-        /// </summary>
-        public static readonly CVarDef<float> MessageWaitTime =
-            CVarDef.Create("admin.message_wait_time", 3f, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
-
-        /// <summary>
-        /// Default severity for role bans
-        /// </summary>
-        public static readonly CVarDef<string> RoleBanDefaultSeverity =
-            CVarDef.Create("admin.role_ban_default_severity", "medium", CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        /// Default severity for department bans
-        /// </summary>
-        public static readonly CVarDef<string> DepartmentBanDefaultSeverity =
-            CVarDef.Create("admin.department_ban_default_severity", "medium", CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        /// Default severity for server bans
-        /// </summary>
-        public static readonly CVarDef<string> ServerBanDefaultSeverity =
-            CVarDef.Create("admin.server_ban_default_severity", "High", CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        /// Whether a server ban will ban the player's ip by default.
-        /// </summary>
-        public static readonly CVarDef<bool> ServerBanIpBanDefault =
-            CVarDef.Create("admin.server_ban_ip_ban_default", true, CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        /// Whether a server ban will ban the player's hardware id by default.
-        /// </summary>
-        public static readonly CVarDef<bool> ServerBanHwidBanDefault =
-            CVarDef.Create("admin.server_ban_hwid_ban_default", true, CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        /// Whether to use details from last connection for ip/hwid in the BanPanel.
-        /// </summary>
-        public static readonly CVarDef<bool> ServerBanUseLastDetails =
-            CVarDef.Create("admin.server_ban_use_last_details", true, CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        /// Whether to erase a player's chat messages and their entity from the game when banned.
-        /// </summary>
-        public static readonly CVarDef<bool> ServerBanErasePlayer =
-            CVarDef.Create("admin.server_ban_erase_player", false, CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        ///     Minimum players sharing a connection required to create an alert. -1 to disable the alert.
-        /// </summary>
-        /// <remarks>
-        ///     If you set this to 0 or 1 then it will alert on every connection, so probably don't do that.
-        /// </remarks>
-        public static readonly CVarDef<int> AdminAlertMinPlayersSharingConnection =
-            CVarDef.Create("admin.alert.min_players_sharing_connection", -1, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Minimum explosion intensity to create an admin alert message. -1 to disable the alert.
-        /// </summary>
-        public static readonly CVarDef<int> AdminAlertExplosionMinIntensity =
-            CVarDef.Create("admin.alert.explosion_min_intensity", 60, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Minimum particle accelerator strength to create an admin alert message.
-        /// </summary>
-        public static readonly CVarDef<int> AdminAlertParticleAcceleratorMinPowerState =
-            CVarDef.Create("admin.alert.particle_accelerator_min_power_state", 5, CVar.SERVERONLY); // strength 4
-
-        /// <summary>
-        ///     Should the ban details in admin channel include PII? (IP, HWID, etc)
-        /// </summary>
-        public static readonly CVarDef<bool> AdminShowPIIOnBan =
-            CVarDef.Create("admin.show_pii_onban", false, CVar.SERVERONLY);
-
-        /// <summary>
-        /// If an admin joins a round by reading up or using the late join button, automatically
-        /// de-admin them.
-        /// </summary>
-        public static readonly CVarDef<bool> AdminDeadminOnJoin =
-            CVarDef.Create("admin.deadmin_on_join", false, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Overrides the name the client sees in ahelps. Set empty to disable.
-        /// </summary>
-        public static readonly CVarDef<string> AdminAhelpOverrideClientName =
-            CVarDef.Create("admin.override_adminname_in_client_ahelp", string.Empty, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     The threshold of minutes to appear as a "new player" in the ahelp menu
-        ///     If 0, appearing as a new player is disabled.
-        /// </summary>
-        public static readonly CVarDef<int> NewPlayerThreshold =
-            CVarDef.Create("admin.new_player_threshold", 0, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
-
-        /// <summary>
-        /// How long an admin client can go without any input before being considered AFK.
-        /// </summary>
-        public static readonly CVarDef<float> AdminAfkTime =
-            CVarDef.Create("admin.afk_time", 600f, CVar.SERVERONLY);
-
-        /// <summary>
-        /// If true, admins are able to connect even if
-        /// <see cref="SoftMaxPlayers"/> would otherwise block regular players.
-        /// </summary>
-        public static readonly CVarDef<bool> AdminBypassMaxPlayers =
-            CVarDef.Create("admin.bypass_max_players", true, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Determine if custom rank names are used.
-        /// If it is false, it'd use the actual rank name regardless of the individual's title.
-        /// </summary>
-        /// <seealso cref="AhelpAdminPrefix"/>
-        /// <seealso cref="AhelpAdminPrefixWebhook"/>
-        public static readonly CVarDef<bool> AdminUseCustomNamesAdminRank =
-            CVarDef.Create("admin.use_custom_names_admin_rank", true, CVar.SERVERONLY);
-
-        /*
-         * AHELP
-         */
-
-        /// <summary>
-        /// Ahelp rate limit values are accounted in periods of this size (seconds).
-        /// After the period has passed, the count resets.
-        /// </summary>
-        /// <seealso cref="AhelpRateLimitCount"/>
-        public static readonly CVarDef<float> AhelpRateLimitPeriod =
-            CVarDef.Create("ahelp.rate_limit_period", 2f, CVar.SERVERONLY);
-
-        /// <summary>
-        /// How many ahelp messages are allowed in a single rate limit period.
-        /// </summary>
-        /// <seealso cref="AhelpRateLimitPeriod"/>
-        public static readonly CVarDef<int> AhelpRateLimitCount =
-            CVarDef.Create("ahelp.rate_limit_count", 10, CVar.SERVERONLY);
-
-        /// <summary>
-        /// 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.
-        /// </summary>
-        /// <seealso cref="AdminUseCustomNamesAdminRank"/>
-        /// <seealso cref="AhelpAdminPrefixWebhook"/>
-        public static readonly CVarDef<bool> AhelpAdminPrefix =
-            CVarDef.Create("ahelp.admin_prefix", false, CVar.SERVERONLY);
-
-        /// <summary>
-        /// 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.
-        /// </summary>
-        /// <seealso cref="AdminUseCustomNamesAdminRank"/>
-        /// <seealso cref="AhelpAdminPrefix"/>
-        public static readonly CVarDef<bool> AhelpAdminPrefixWebhook =
-            CVarDef.Create("ahelp.admin_prefix_webhook", false, CVar.SERVERONLY);
-
-        /*
-         * Explosions
-         */
-
-        /// <summary>
-        ///     How many tiles the explosion system will process per tick
-        /// </summary>
-        /// <remarks>
-        ///     Setting this too high will put a large load on a single tick. Setting this too low will lead to
-        ///     unnaturally "slow" explosions.
-        /// </remarks>
-        public static readonly CVarDef<int> ExplosionTilesPerTick =
-            CVarDef.Create("explosion.tiles_per_tick", 100, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Upper limit on the size of an explosion before physics-throwing is disabled.
-        /// </summary>
-        /// <remarks>
-        ///     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.
-        /// </remarks>
-        public static readonly CVarDef<int> ExplosionThrowLimit =
-            CVarDef.Create("explosion.throw_limit", 400, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     If this is true, explosion processing will pause the NodeGroupSystem to pause updating.
-        /// </summary>
-        /// <remarks>
-        ///     This only takes effect if an explosion needs more than one tick to process (i.e., covers more than <see
-        ///     cref="ExplosionTilesPerTick"/> tiles). If this is not enabled, the node-system will rebuild its graph
-        ///     every tick as the explosion shreds the station, causing significant slowdown.
-        /// </remarks>
-        public static readonly CVarDef<bool> ExplosionSleepNodeSys =
-            CVarDef.Create("explosion.node_sleep", true, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     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.
-        /// </summary>
-        /// <remarks>
-        ///     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.
-        /// </remarks>
-        public static readonly CVarDef<int> ExplosionMaxArea =
-            CVarDef.Create("explosion.max_area", (int) 3.14f * 256 * 256, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Upper limit on the number of neighbor finding steps for the explosion system neighbor-finding algorithm.
-        /// </summary>
-        /// <remarks>
-        ///     Effectively places an upper limit on the range that any explosion can have. In the vast majority of
-        ///     instances, <see cref="ExplosionMaxArea"/> will likely be hit before this becomes a limiting factor.
-        /// </remarks>
-        public static readonly CVarDef<int> ExplosionMaxIterations =
-            CVarDef.Create("explosion.max_iterations", 500, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Max Time in milliseconds to spend processing explosions every tick.
-        /// </summary>
-        /// <remarks>
-        ///     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.
-        /// </remarks>
-        public static readonly CVarDef<float> ExplosionMaxProcessingTime =
-            CVarDef.Create("explosion.max_tick_time", 7f, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     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.
-        /// </summary>
-        /// <remarks>
-        ///     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.
-        /// </remarks>
-        public static readonly CVarDef<bool> ExplosionIncrementalTileBreaking =
-            CVarDef.Create("explosion.incremental_tile", false, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     This determines for how many seconds an explosion should stay visible once it has finished expanding.
-        /// </summary>
-        public static readonly CVarDef<float> ExplosionPersistence =
-            CVarDef.Create("explosion.persistence", 1.0f, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     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.
-        /// </summary>
-        /// <remarks>
-        ///     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 <see
-        ///     cref="ExplosionMaxProcessingTime"/> and <see cref="ExplosionTilesPerTick"/> 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.
-        /// </remarks>
-        public static readonly CVarDef<int> ExplosionSingleTickAreaLimit =
-            CVarDef.Create("explosion.single_tick_area_limit", 400, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Whether or not explosions are allowed to create tiles that have
-        ///     <see cref="ContentTileDefinition.MapAtmosphere"/> set to true.
-        /// </summary>
-        public static readonly CVarDef<bool> ExplosionCanCreateVacuum =
-            CVarDef.Create("explosion.can_create_vacuum", true, CVar.SERVERONLY);
-
-        /*
-         * Radiation
-         */
-
-        /// <summary>
-        ///     What is the smallest radiation dose in rads that can be received by object.
-        ///     Extremely small values may impact performance.
-        /// </summary>
-        public static readonly CVarDef<float> RadiationMinIntensity =
-            CVarDef.Create("radiation.min_intensity", 0.1f, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Rate of radiation system update in seconds.
-        /// </summary>
-        public static readonly CVarDef<float> RadiationGridcastUpdateRate =
-            CVarDef.Create("radiation.gridcast.update_rate", 1.0f, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     If both radiation source and receiver are placed on same grid, ignore grids between them.
-        ///     May get inaccurate result in some cases, but greatly boost performance in general.
-        /// </summary>
-        public static readonly CVarDef<bool> RadiationGridcastSimplifiedSameGrid =
-            CVarDef.Create("radiation.gridcast.simplified_same_grid", true, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Max distance that radiation ray can travel in meters.
-        /// </summary>
-        public static readonly CVarDef<float> RadiationGridcastMaxDistance =
-            CVarDef.Create("radiation.gridcast.max_distance", 50f, CVar.SERVERONLY);
-
-        /*
-         * Admin logs
-         */
-
-        /// <summary>
-        ///     Controls if admin logs are enabled. Highly recommended to shut this off for development.
-        /// </summary>
-        public static readonly CVarDef<bool> AdminLogsEnabled =
-            CVarDef.Create("adminlogs.enabled", true, CVar.SERVERONLY);
-
-        public static readonly CVarDef<float> 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<int> 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<int> AdminLogsPreRoundQueueMax =
-            CVarDef.Create("adminlogs.pre_round_queue_max", 5000, CVar.SERVERONLY);
-
-        // When to start dropping logs
-        public static readonly CVarDef<int> AdminLogsDropThreshold =
-            CVarDef.Create("adminlogs.drop_threshold", 20000, CVar.SERVERONLY);
-
-        // How many logs to send to the client at once
-        public static readonly CVarDef<int> AdminLogsClientBatchSize =
-            CVarDef.Create("adminlogs.client_batch_size", 1000, CVar.SERVERONLY);
-
-        public static readonly CVarDef<string> AdminLogsServerName =
-            CVarDef.Create("adminlogs.server_name", "unknown", CVar.SERVERONLY);
-
-        /*
-         * Atmos
-         */
-
-        /// <summary>
-        ///     Whether gas differences will move entities.
-        /// </summary>
-        public static readonly CVarDef<bool> SpaceWind =
-            CVarDef.Create("atmos.space_wind", false, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Divisor from maxForce (pressureDifference * 2.25f) to force applied on objects.
-        /// </summary>
-        public static readonly CVarDef<float> SpaceWindPressureForceDivisorThrow =
-            CVarDef.Create("atmos.space_wind_pressure_force_divisor_throw", 15f, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Divisor from maxForce (pressureDifference * 2.25f) to force applied on objects.
-        /// </summary>
-        public static readonly CVarDef<float> SpaceWindPressureForceDivisorPush =
-            CVarDef.Create("atmos.space_wind_pressure_force_divisor_push", 2500f, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     The maximum velocity (not force) that may be applied to an object by atmospheric pressure differences.
-        ///     Useful to prevent clipping through objects.
-        /// </summary>
-        public static readonly CVarDef<float> SpaceWindMaxVelocity =
-            CVarDef.Create("atmos.space_wind_max_velocity", 30f, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     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.
-        /// </summary>
-        public static readonly CVarDef<float> SpaceWindMaxPushForce =
-            CVarDef.Create("atmos.space_wind_max_push_force", 20f, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Whether monstermos tile equalization is enabled.
-        /// </summary>
-        public static readonly CVarDef<bool> MonstermosEqualization =
-            CVarDef.Create("atmos.monstermos_equalization", true, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Whether monstermos explosive depressurization is enabled.
-        ///     Needs <see cref="MonstermosEqualization"/> to be enabled to work.
-        /// </summary>
-        public static readonly CVarDef<bool> MonstermosDepressurization =
-            CVarDef.Create("atmos.monstermos_depressurization", true, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Whether monstermos explosive depressurization will rip tiles..
-        ///     Needs <see cref="MonstermosEqualization"/> and <see cref="MonstermosDepressurization"/> 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.
-        /// </summary>
-        public static readonly CVarDef<bool> MonstermosRipTiles =
-            CVarDef.Create("atmos.monstermos_rip_tiles", false, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Whether explosive depressurization will cause the grid to gain an impulse.
-        ///     Needs <see cref="MonstermosEqualization"/> and <see cref="MonstermosDepressurization"/> to be enabled to work.
-        /// </summary>
-        public static readonly CVarDef<bool> AtmosGridImpulse =
-            CVarDef.Create("atmos.grid_impulse", false, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     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
-        /// </summary>
-        public static readonly CVarDef<float> AtmosSpacingEscapeRatio =
-            CVarDef.Create("atmos.mmos_spacing_speed", 0.15f, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     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.
-        /// </summary>
-        public static readonly CVarDef<float> AtmosSpacingMinGas =
-            CVarDef.Create("atmos.mmos_min_gas", 2.0f, CVar.SERVERONLY);
+namespace Content.Shared.CCVar;
 
-        /// <summary>
-        ///     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)
-        /// </summary>
-        public static readonly CVarDef<float> AtmosSpacingMaxWind =
-            CVarDef.Create("atmos.mmos_max_wind", 500f, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Whether atmos superconduction is enabled.
-        /// </summary>
-        /// <remarks> Disabled by default, superconduction is awful. </remarks>
-        public static readonly CVarDef<bool> Superconduction =
-            CVarDef.Create("atmos.superconduction", false, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Heat loss per tile due to radiation at 20 degC, in W.
-        /// </summary>
-        public static readonly CVarDef<float> SuperconductionTileLoss =
-            CVarDef.Create("atmos.superconduction_tile_loss", 30f, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Whether excited groups will be processed and created.
-        /// </summary>
-        public static readonly CVarDef<bool> ExcitedGroups =
-            CVarDef.Create("atmos.excited_groups", true, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Whether all tiles in an excited group will clear themselves once being exposed to space.
-        ///     Similar to <see cref="MonstermosDepressurization"/>, without none of the tile ripping or
-        ///     things being thrown around very violently.
-        ///     Needs <see cref="ExcitedGroups"/> to be enabled to work.
-        /// </summary>
-        public static readonly CVarDef<bool> ExcitedGroupsSpaceIsAllConsuming =
-            CVarDef.Create("atmos.excited_groups_space_is_all_consuming", false, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Maximum time in milliseconds that atmos can take processing.
-        /// </summary>
-        public static readonly CVarDef<float> AtmosMaxProcessTime =
-            CVarDef.Create("atmos.max_process_time", 3f, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Atmos tickrate in TPS. Atmos processing will happen every 1/TPS seconds.
-        /// </summary>
-        public static readonly CVarDef<float> AtmosTickRate =
-            CVarDef.Create("atmos.tickrate", 15f, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     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.
-        /// </summary>
-        public static readonly CVarDef<float> AtmosSpeedup =
-            CVarDef.Create("atmos.speedup", 8f, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Like atmos.speedup, but only for gas and reaction heat values. 64x means
-        ///     gases heat up and cool down 64x faster than real life.
-        /// </summary>
-        public static readonly CVarDef<float> AtmosHeatScale =
-            CVarDef.Create("atmos.heat_scale", 8f, CVar.SERVERONLY);
-
-        /// <summary>
-        /// 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.
-        /// </summary>
-        public static readonly CVarDef<float> AtmosTankFragment =
-            CVarDef.Create("atmos.max_explosion_range", 26f, CVar.SERVERONLY);
-
-        /*
-         * MIDI instruments
-         */
-
-        public static readonly CVarDef<int> MaxMidiEventsPerSecond =
-            CVarDef.Create("midi.max_events_per_second", 1000, CVar.REPLICATED | CVar.SERVER);
-
-        public static readonly CVarDef<int> MaxMidiEventsPerBatch =
-            CVarDef.Create("midi.max_events_per_batch", 60, CVar.REPLICATED | CVar.SERVER);
-
-        public static readonly CVarDef<int> MaxMidiBatchesDropped =
-            CVarDef.Create("midi.max_batches_dropped", 1, CVar.SERVERONLY);
-
-        public static readonly CVarDef<int> MaxMidiLaggedBatches =
-            CVarDef.Create("midi.max_lagged_batches", 8, CVar.SERVERONLY);
-
-        /*
-         * Holidays
-         */
-
-        public static readonly CVarDef<bool> HolidaysEnabled = CVarDef.Create("holidays.enabled", true, CVar.SERVERONLY);
-
-        /*
-         * Branding stuff
-         */
-
-        public static readonly CVarDef<bool> BrandingSteam = CVarDef.Create("branding.steam", false, CVar.CLIENTONLY);
-
-        /*
-         * OOC
-         */
-
-        public static readonly CVarDef<bool> OocEnabled = CVarDef.Create("ooc.enabled", true, CVar.NOTIFY | CVar.REPLICATED);
-
-        public static readonly CVarDef<bool> AdminOocEnabled =
-            CVarDef.Create("ooc.enabled_admin", true, CVar.NOTIFY);
-
-        /// <summary>
-        /// If true, whenever OOC is disabled the Discord OOC relay will also be disabled.
-        /// </summary>
-        public static readonly CVarDef<bool> DisablingOOCDisablesRelay = CVarDef.Create("ooc.disabling_ooc_disables_relay", true, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Whether or not OOC chat should be enabled during a round.
-        /// </summary>
-        public static readonly CVarDef<bool> OocEnableDuringRound =
-            CVarDef.Create("ooc.enable_during_round", false, CVar.NOTIFY | CVar.REPLICATED | CVar.SERVER);
-
-        public static readonly CVarDef<bool> ShowOocPatronColor =
-            CVarDef.Create("ooc.show_ooc_patron_color", true, CVar.ARCHIVE | CVar.REPLICATED | CVar.CLIENT);
-
-        /*
-         * LOOC
-         */
-
-        public static readonly CVarDef<bool> LoocEnabled = CVarDef.Create("looc.enabled", true, CVar.NOTIFY | CVar.REPLICATED);
-
-        public static readonly CVarDef<bool> AdminLoocEnabled =
-            CVarDef.Create("looc.enabled_admin", true, CVar.NOTIFY);
-
-        /// <summary>
-        /// True: Dead players can use LOOC
-        /// False: Dead player LOOC gets redirected to dead chat
-        /// </summary>
-        public static readonly CVarDef<bool> DeadLoocEnabled = CVarDef.Create("looc.enabled_dead", false, CVar.NOTIFY | CVar.REPLICATED);
-
-        /// <summary>
-        /// True: Crit players can use LOOC
-        /// False: Crit player LOOC gets redirected to dead chat
-        /// </summary>
-        public static readonly CVarDef<bool> CritLoocEnabled = CVarDef.Create("looc.enabled_crit", false, CVar.NOTIFY | CVar.REPLICATED);
-
-        /*
-         * Entity Menu Grouping Types
-         */
-        public static readonly CVarDef<int> EntityMenuGroupingType = CVarDef.Create("entity_menu", 0, CVar.CLIENTONLY);
-
-        /*
-         * Whitelist
-         */
-
-        /// <summary>
-        ///     Controls whether the server will deny any players that are not whitelisted in the DB.
-        /// </summary>
-        public static readonly CVarDef<bool> WhitelistEnabled =
-            CVarDef.Create("whitelist.enabled", false, CVar.SERVERONLY);
-        /// <summary>
-        ///     Specifies the whitelist prototypes to be used by the server. This should be a comma-separated list of prototypes.
-        ///     If a whitelists conditions to be active fail (for example player count), the next whitelist will be used instead. If no whitelist is valid, the player will be allowed to connect.
-        /// </summary>
-        public static readonly CVarDef<string> WhitelistPrototypeList =
-            CVarDef.Create("whitelist.prototype_list", "basicWhitelist", CVar.SERVERONLY);
-
-        /*
-         * VOTE
-         */
-
-        /// <summary>
-        ///     Allows enabling/disabling player-started votes for ultimate authority
-        /// </summary>
-        public static readonly CVarDef<bool> VoteEnabled =
-            CVarDef.Create("vote.enabled", true, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     See vote.enabled, but specific to restart votes
-        /// </summary>
-        public static readonly CVarDef<bool> VoteRestartEnabled =
-            CVarDef.Create("vote.restart_enabled", true, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Config for when the restart vote should be allowed to be called regardless with less than this amount of players.
-        /// </summary>
-        public static readonly CVarDef<int> VoteRestartMaxPlayers =
-            CVarDef.Create("vote.restart_max_players", 20, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Config for when the restart vote should be allowed to be called based on percentage of ghosts.
-        ///
-        public static readonly CVarDef<int> VoteRestartGhostPercentage =
-            CVarDef.Create("vote.restart_ghost_percentage", 55, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     See vote.enabled, but specific to preset votes
-        /// </summary>
-        public static readonly CVarDef<bool> VotePresetEnabled =
-            CVarDef.Create("vote.preset_enabled", true, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     See vote.enabled, but specific to map votes
-        /// </summary>
-        public static readonly CVarDef<bool> VoteMapEnabled =
-            CVarDef.Create("vote.map_enabled", false, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     The required ratio of the server that must agree for a restart round vote to go through.
-        /// </summary>
-        public static readonly CVarDef<float> VoteRestartRequiredRatio =
-            CVarDef.Create("vote.restart_required_ratio", 0.85f, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Whether or not to prevent the restart vote from having any effect when there is an online admin
-        /// </summary>
-        public static readonly CVarDef<bool> VoteRestartNotAllowedWhenAdminOnline =
-            CVarDef.Create("vote.restart_not_allowed_when_admin_online", true, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     The delay which two votes of the same type are allowed to be made by separate people, in seconds.
-        /// </summary>
-        public static readonly CVarDef<float> VoteSameTypeTimeout =
-            CVarDef.Create("vote.same_type_timeout", 240f, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Sets the duration of the map vote timer.
-        /// </summary>
-        public static readonly CVarDef<int>
-            VoteTimerMap = CVarDef.Create("vote.timermap", 90, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Sets the duration of the restart vote timer.
-        /// </summary>
-        public static readonly CVarDef<int>
-            VoteTimerRestart = CVarDef.Create("vote.timerrestart", 60, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Sets the duration of the gamemode/preset vote timer.
-        /// </summary>
-        public static readonly CVarDef<int>
-            VoteTimerPreset = CVarDef.Create("vote.timerpreset", 30, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Sets the duration of the map vote timer when ALONE.
-        /// </summary>
-        public static readonly CVarDef<int>
-            VoteTimerAlone = CVarDef.Create("vote.timeralone", 10, CVar.SERVERONLY);
-
-        /*
-         * VOTEKICK
-         */
-
-        /// <summary>
-        ///     Allows enabling/disabling player-started votekick for ultimate authority
-        /// </summary>
-        public static readonly CVarDef<bool> VotekickEnabled =
-            CVarDef.Create("votekick.enabled", true, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Config for when the votekick should be allowed to be called based on number of eligible voters.
-        /// </summary>
-        public static readonly CVarDef<int> VotekickEligibleNumberRequirement =
-            CVarDef.Create("votekick.eligible_number", 5, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Whether a votekick initiator must be a ghost or not.
-        /// </summary>
-        public static readonly CVarDef<bool> VotekickInitiatorGhostRequirement =
-            CVarDef.Create("votekick.initiator_ghost_requirement", true, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Should the initiator be whitelisted to initiate a votekick?
-        /// </summary>
-        public static readonly CVarDef<bool> VotekickInitiatorWhitelistedRequirement =
-            CVarDef.Create("votekick.initiator_whitelist_requirement", true, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Should the initiator be able to start a votekick if they are bellow the votekick.voter_playtime requirement?
-        /// </summary>
-        public static readonly CVarDef<bool> VotekickInitiatorTimeRequirement =
-            CVarDef.Create("votekick.initiator_time_requirement", false, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Whether a votekick voter must be a ghost or not.
-        /// </summary>
-        public static readonly CVarDef<bool> VotekickVoterGhostRequirement =
-            CVarDef.Create("votekick.voter_ghost_requirement", true, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Config for how many hours playtime a player must have to be able to vote on a votekick.
-        /// </summary>
-        public static readonly CVarDef<int> VotekickEligibleVoterPlaytime =
-            CVarDef.Create("votekick.voter_playtime", 100, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Config for how many seconds a player must have been dead to initiate a votekick / be able to vote on a votekick.
-        /// </summary>
-        public static readonly CVarDef<int> VotekickEligibleVoterDeathtime =
-            CVarDef.Create("votekick.voter_deathtime", 30, CVar.REPLICATED | CVar.SERVER);
-
-        /// <summary>
-        ///     The required ratio of eligible voters that must agree for a votekick to go through.
-        /// </summary>
-        public static readonly CVarDef<float> VotekickRequiredRatio =
-            CVarDef.Create("votekick.required_ratio", 0.6f, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Whether or not to prevent the votekick from having any effect when there is an online admin.
-        /// </summary>
-        public static readonly CVarDef<bool> VotekickNotAllowedWhenAdminOnline =
-            CVarDef.Create("votekick.not_allowed_when_admin_online", true, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     The delay for which two votekicks are allowed to be made by separate people, in seconds.
-        /// </summary>
-        public static readonly CVarDef<float> VotekickTimeout =
-            CVarDef.Create("votekick.timeout", 120f, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Sets the duration of the votekick vote timer.
-        /// </summary>
-        public static readonly CVarDef<int>
-            VotekickTimer = CVarDef.Create("votekick.timer", 60, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Config for how many hours playtime a player must have to get protection from the Raider votekick type when playing as an antag.
-        /// </summary>
-        public static readonly CVarDef<int> VotekickAntagRaiderProtection =
-            CVarDef.Create("votekick.antag_raider_protection", 10, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Default severity for votekick bans
-        /// </summary>
-        public static readonly CVarDef<string> VotekickBanDefaultSeverity =
-            CVarDef.Create("votekick.ban_default_severity", "High", CVar.ARCHIVE | CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        ///     Duration of a ban caused by a votekick (in minutes).
-        /// </summary>
-        public static readonly CVarDef<int> VotekickBanDuration =
-            CVarDef.Create("votekick.ban_duration", 180, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Whether the ghost requirement settings for votekicks should be ignored for the lobby. 
-        /// </summary>
-        public static readonly CVarDef<bool> VotekickIgnoreGhostReqInLobby =
-            CVarDef.Create("votekick.ignore_ghost_req_in_lobby", true, CVar.SERVERONLY);
-
-        /*
-         * BAN
-         */
-
-        public static readonly CVarDef<bool> BanHardwareIds =
-            CVarDef.Create("ban.hardware_ids", true, CVar.SERVERONLY);
-
-        /*
-         * Procgen
-         */
-
-        /// <summary>
-        /// Should we pre-load all of the procgen atlasses.
-        /// </summary>
-        public static readonly CVarDef<bool> ProcgenPreload =
-            CVarDef.Create("procgen.preload", true, CVar.SERVERONLY);
-
-        /*
-         * Shuttles
-         */
-
-        // Look this is technically eye behavior but its main impact is shuttles so I just dumped it here.
-        /// <summary>
-        /// If true then the camera will match the grid / map and is unchangeable.
-        /// - When traversing grids it will snap to 0 degrees rotation.
-        /// False means the player has control over the camera rotation.
-        /// - When traversing grids it will snap to the nearest cardinal which will generally be imperceptible.
-        /// </summary>
-        public static readonly CVarDef<bool> CameraRotationLocked =
-            CVarDef.Create("shuttle.camera_rotation_locked", false, CVar.REPLICATED);
-
-        /// <summary>
-        /// Whether the arrivals terminal should be on a planet map.
-        /// </summary>
-        public static readonly CVarDef<bool> ArrivalsPlanet =
-            CVarDef.Create("shuttle.arrivals_planet", true, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Whether the arrivals shuttle is enabled.
-        /// </summary>
-        public static readonly CVarDef<bool> ArrivalsShuttles =
-            CVarDef.Create("shuttle.arrivals", true, CVar.SERVERONLY);
-
-        /// <summary>
-        /// The map to use for the arrivals station.
-        /// </summary>
-        public static readonly CVarDef<string> ArrivalsMap =
-            CVarDef.Create("shuttle.arrivals_map", "/Maps/Misc/terminal.yml", CVar.SERVERONLY);
-
-        /// <summary>
-        /// Cooldown between arrivals departures. This should be longer than the FTL time or it will double cycle.
-        /// </summary>
-        public static readonly CVarDef<float> ArrivalsCooldown =
-            CVarDef.Create("shuttle.arrivals_cooldown", 50f, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Are players allowed to return on the arrivals shuttle.
-        /// </summary>
-        public static readonly CVarDef<bool> ArrivalsReturns =
-            CVarDef.Create("shuttle.arrivals_returns", false, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Should all players who spawn at arrivals have godmode until they leave the map?
-        /// </summary>
-        public static readonly CVarDef<bool> GodmodeArrivals =
-            CVarDef.Create("shuttle.godmode_arrivals", false, CVar.SERVERONLY);
-
-        /// <summary>
-        /// If a grid is split then hide any smaller ones under this mass (kg) from the map.
-        /// This is useful to avoid split grids spamming out labels.
-        /// </summary>
-        public static readonly CVarDef<int> HideSplitGridsUnder =
-            CVarDef.Create("shuttle.hide_split_grids_under", 30, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Whether to automatically spawn escape shuttles.
-        /// </summary>
-        public static readonly CVarDef<bool> GridFill =
-            CVarDef.Create("shuttle.grid_fill", true, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Whether to automatically preloading grids by GridPreloaderSystem
-        /// </summary>
-        public static readonly CVarDef<bool> PreloadGrids =
-            CVarDef.Create("shuttle.preload_grids", true, CVar.SERVERONLY);
-
-        /// <summary>
-        /// How long the warmup time before FTL start should be.
-        /// </summary>
-        public static readonly CVarDef<float> FTLStartupTime =
-            CVarDef.Create("shuttle.startup_time", 5.5f, CVar.SERVERONLY);
-
-        /// <summary>
-        /// How long a shuttle spends in FTL.
-        /// </summary>
-        public static readonly CVarDef<float> FTLTravelTime =
-            CVarDef.Create("shuttle.travel_time", 20f, CVar.SERVERONLY);
-
-        /// <summary>
-        /// How long the final stage of FTL before arrival should be.
-        /// </summary>
-        public static readonly CVarDef<float> FTLArrivalTime =
-            CVarDef.Create("shuttle.arrival_time", 5f, CVar.SERVERONLY);
-
-        /// <summary>
-        /// How much time needs to pass before a shuttle can FTL again.
-        /// </summary>
-        public static readonly CVarDef<float> FTLCooldown =
-            CVarDef.Create("shuttle.cooldown", 10f, CVar.SERVERONLY);
-
-        /// <summary>
-        /// The maximum <see cref="PhysicsComponent.Mass"/> a grid can have before it becomes unable to FTL.
-        /// Any value equal to or less than zero will disable this check.
-        /// </summary>
-        public static readonly CVarDef<float> FTLMassLimit =
-            CVarDef.Create("shuttle.mass_limit", 300f, CVar.SERVERONLY);
-
-        /// <summary>
-        /// How long to knock down entities for if they aren't buckled when FTL starts and stops.
-        /// </summary>
-        public static readonly CVarDef<float> HyperspaceKnockdownTime =
-            CVarDef.Create("shuttle.hyperspace_knockdown_time", 5f, CVar.SERVERONLY);
-
-        /*
-         * Emergency
-         */
-
-        /// <summary>
-        /// Is the emergency shuttle allowed to be early launched.
-        /// </summary>
-        public static readonly CVarDef<bool> EmergencyEarlyLaunchAllowed =
-            CVarDef.Create("shuttle.emergency_early_launch_allowed", false, CVar.SERVERONLY);
-
-        /// <summary>
-        /// How long the emergency shuttle remains docked with the station, in seconds.
-        /// </summary>
-        public static readonly CVarDef<float> EmergencyShuttleDockTime =
-            CVarDef.Create("shuttle.emergency_dock_time", 180f, CVar.SERVERONLY);
-
-        /// <summary>
-        /// If the emergency shuttle can't dock at a priority port, the dock time will be multiplied with this value.
-        /// </summary>
-        public static readonly CVarDef<float> EmergencyShuttleDockTimeMultiplierOtherDock =
-            CVarDef.Create("shuttle.emergency_dock_time_multiplier_other_dock", 1.6667f, CVar.SERVERONLY);
-
-        /// <summary>
-        /// If the emergency shuttle can't dock at all, the dock time will be multiplied with this value.
-        /// </summary>
-        public static readonly CVarDef<float> EmergencyShuttleDockTimeMultiplierNoDock =
-            CVarDef.Create("shuttle.emergency_dock_time_multiplier_no_dock", 2f, CVar.SERVERONLY);
-
-        /// <summary>
-        /// How long after the console is authorized for the shuttle to early launch.
-        /// </summary>
-        public static readonly CVarDef<float> EmergencyShuttleAuthorizeTime =
-            CVarDef.Create("shuttle.emergency_authorize_time", 10f, CVar.SERVERONLY);
-
-        /// <summary>
-        /// The minimum time for the emergency shuttle to arrive at centcomm.
-        /// Actual minimum travel time cannot be less than <see cref="ShuttleSystem.DefaultArrivalTime"/>
-        /// </summary>
-        public static readonly CVarDef<float> EmergencyShuttleMinTransitTime =
-            CVarDef.Create("shuttle.emergency_transit_time_min", 60f, CVar.SERVERONLY);
-
-        /// <summary>
-        /// The maximum time for the emergency shuttle to arrive at centcomm.
-        /// </summary>
-        public static readonly CVarDef<float> EmergencyShuttleMaxTransitTime =
-            CVarDef.Create("shuttle.emergency_transit_time_max", 180f, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Whether the emergency shuttle is enabled or should the round just end.
-        /// </summary>
-        public static readonly CVarDef<bool> EmergencyShuttleEnabled =
-            CVarDef.Create("shuttle.emergency", true, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     The percentage of time passed from the initial call to when the shuttle can no longer be recalled.
-        ///     ex. a call time of 10min and turning point of 0.5 means the shuttle cannot be recalled after 5 minutes.
-        /// </summary>
-        public static readonly CVarDef<float> EmergencyRecallTurningPoint =
-            CVarDef.Create("shuttle.recall_turning_point", 0.5f, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Time in minutes after round start to auto-call the shuttle. Set to zero to disable.
-        /// </summary>
-        public static readonly CVarDef<int> EmergencyShuttleAutoCallTime =
-            CVarDef.Create("shuttle.auto_call_time", 90, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Time in minutes after the round was extended (by recalling the shuttle) to call
-        ///     the shuttle again.
-        /// </summary>
-        public static readonly CVarDef<int> EmergencyShuttleAutoCallExtensionTime =
-            CVarDef.Create("shuttle.auto_call_extension_time", 45, CVar.SERVERONLY);
-
-        /*
-         * Crew Manifests
-         */
-
-        /// <summary>
-        ///     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.
-        /// </summary>
-        public static readonly CVarDef<bool> CrewManifestWithoutEntity =
-            CVarDef.Create("crewmanifest.no_entity", true, CVar.REPLICATED);
-
-        /// <summary>
-        ///     Setting this allows the crew manifest to be viewed from 'unsecure'
-        ///     entities, such as the PDA.
-        /// </summary>
-        public static readonly CVarDef<bool> CrewManifestUnsecure =
-            CVarDef.Create("crewmanifest.unsecure", true, CVar.REPLICATED);
-
-        /*
-         * Biomass
-         */
-
-        /// <summary>
-        ///     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+).
-        /// </summary>
-        public static readonly CVarDef<bool> BiomassEasyMode =
-            CVarDef.Create("biomass.easy_mode", true, CVar.SERVERONLY);
-
-        /*
-         * Anomaly
-         */
-
-        /// <summary>
-        ///     A scale factor applied to a grid's bounds when trying to find a spot to randomly generate an anomaly.
-        /// </summary>
-        public static readonly CVarDef<float> AnomalyGenerationGridBoundsScale =
-            CVarDef.Create("anomaly.generation_grid_bounds_scale", 0.6f, CVar.SERVERONLY);
-
-        /*
-         * VIEWPORT
-         */
-
-        public static readonly CVarDef<bool> ViewportStretch =
-            CVarDef.Create("viewport.stretch", true, CVar.CLIENTONLY | CVar.ARCHIVE);
-
-        public static readonly CVarDef<int> ViewportFixedScaleFactor =
-            CVarDef.Create("viewport.fixed_scale_factor", 2, CVar.CLIENTONLY | CVar.ARCHIVE);
-
-        // This default is basically specifically chosen so fullscreen/maximized 1080p hits a 2x snap and does NN.
-        public static readonly CVarDef<int> ViewportSnapToleranceMargin =
-            CVarDef.Create("viewport.snap_tolerance_margin", 64, CVar.CLIENTONLY | CVar.ARCHIVE);
-
-        public static readonly CVarDef<int> ViewportSnapToleranceClip =
-            CVarDef.Create("viewport.snap_tolerance_clip", 32, CVar.CLIENTONLY | CVar.ARCHIVE);
-
-        public static readonly CVarDef<bool> ViewportScaleRender =
-            CVarDef.Create("viewport.scale_render", true, CVar.CLIENTONLY | CVar.ARCHIVE);
-
-        public static readonly CVarDef<int> ViewportMinimumWidth =
-            CVarDef.Create("viewport.minimum_width", 15, CVar.REPLICATED | CVar.SERVER);
-
-        public static readonly CVarDef<int> ViewportMaximumWidth =
-            CVarDef.Create("viewport.maximum_width", 21, CVar.REPLICATED | CVar.SERVER);
-
-        public static readonly CVarDef<int> ViewportWidth =
-            CVarDef.Create("viewport.width", 21, CVar.CLIENTONLY | CVar.ARCHIVE);
-
-        public static readonly CVarDef<bool> ViewportVerticalFit =
-            CVarDef.Create("viewport.vertical_fit", true, CVar.CLIENTONLY | CVar.ARCHIVE);
-
-        /*
-         * UI
-         */
-
-        public static readonly CVarDef<string> UILayout =
-            CVarDef.Create("ui.layout", "Default", CVar.CLIENTONLY | CVar.ARCHIVE);
-
-        public static readonly CVarDef<string> DefaultScreenChatSize =
-            CVarDef.Create("ui.default_chat_size", "", CVar.CLIENTONLY | CVar.ARCHIVE);
-
-        public static readonly CVarDef<string> SeparatedScreenChatSize =
-            CVarDef.Create("ui.separated_chat_size", "0.6,0", CVar.CLIENTONLY | CVar.ARCHIVE);
-
-
-        /*
-        * Accessibility
-        */
-
-        /// <summary>
-        /// Chat window opacity slider, controlling the alpha of the chat window background.
-        /// Goes from to 0 (completely transparent) to 1 (completely opaque)
-        /// </summary>
-        public static readonly CVarDef<float> ChatWindowOpacity =
-            CVarDef.Create("accessibility.chat_window_transparency", 0.85f, CVar.CLIENTONLY | CVar.ARCHIVE);
-
-        /// <summary>
-        /// 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.
-        /// </summary>
-        public static readonly CVarDef<bool> ReducedMotion =
-            CVarDef.Create("accessibility.reduced_motion", false, CVar.CLIENTONLY | CVar.ARCHIVE);
-
-        public static readonly CVarDef<bool> ChatEnableColorName =
-            CVarDef.Create("accessibility.enable_color_name", true, CVar.CLIENTONLY | CVar.ARCHIVE, "Toggles displaying names with individual colors.");
-
-        /// <summary>
-        /// Screen shake intensity slider, controlling the intensity of the CameraRecoilSystem.
-        /// Goes from 0 (no recoil at all) to 1 (regular amounts of recoil)
-        /// </summary>
-        public static readonly CVarDef<float> ScreenShakeIntensity =
-            CVarDef.Create("accessibility.screen_shake_intensity", 1f, CVar.CLIENTONLY | CVar.ARCHIVE);
-
-        /// <summary>
-        /// A generic toggle for various visual effects that are color sensitive.
-        /// As of 2/16/24, only applies to progress bar colors.
-        /// </summary>
-        public static readonly CVarDef<bool> AccessibilityColorblindFriendly =
-            CVarDef.Create("accessibility.colorblind_friendly", false, CVar.CLIENTONLY | CVar.ARCHIVE);
-
-        /*
-         * CHAT
-         */
-
-        /// <summary>
-        /// Chat rate limit values are accounted in periods of this size (seconds).
-        /// After the period has passed, the count resets.
-        /// </summary>
-        /// <seealso cref="ChatRateLimitCount"/>
-        public static readonly CVarDef<float> ChatRateLimitPeriod =
-            CVarDef.Create("chat.rate_limit_period", 2f, CVar.SERVERONLY);
-
-        /// <summary>
-        /// How many chat messages are allowed in a single rate limit period.
-        /// </summary>
-        /// <remarks>
-        /// The total rate limit throughput per second is effectively
-        /// <see cref="ChatRateLimitCount"/> divided by <see cref="ChatRateLimitCount"/>.
-        /// </remarks>
-        /// <seealso cref="ChatRateLimitPeriod"/>
-        public static readonly CVarDef<int> ChatRateLimitCount =
-            CVarDef.Create("chat.rate_limit_count", 10, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Minimum delay (in seconds) between notifying admins about chat message rate limit violations.
-        /// A negative value disables admin announcements.
-        /// </summary>
-        public static readonly CVarDef<int> ChatRateLimitAnnounceAdminsDelay =
-            CVarDef.Create("chat.rate_limit_announce_admins_delay", 15, CVar.SERVERONLY);
-
-        public static readonly CVarDef<int> ChatMaxMessageLength =
-            CVarDef.Create("chat.max_message_length", 1000, CVar.SERVER | CVar.REPLICATED);
-
-        public static readonly CVarDef<int> ChatMaxAnnouncementLength =
-            CVarDef.Create("chat.max_announcement_length", 256, CVar.SERVER | CVar.REPLICATED);
-
-        public static readonly CVarDef<bool> ChatSanitizerEnabled =
-            CVarDef.Create("chat.chat_sanitizer_enabled", true, CVar.SERVERONLY);
-
-        public static readonly CVarDef<bool> ChatShowTypingIndicator =
-            CVarDef.Create("chat.show_typing_indicator", true, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER);
-
-        public static readonly CVarDef<bool> 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<bool> ChatFancyNameBackground =
-            CVarDef.Create("chat.fancy_name_background", false, CVar.CLIENTONLY | CVar.ARCHIVE, "Toggles displaying a background under the speaking character's name.");
-
-        /// <summary>
-        /// 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.
-        /// </summary>
-        public static readonly CVarDef<string> MOTD =
-            CVarDef.Create("chat.motd", "", CVar.SERVER | CVar.SERVERONLY | CVar.ARCHIVE, "A message broadcast to each player that joins the lobby.");
-
-        /*
-         * AFK
-         */
-
-        /// <summary>
-        /// How long a client can go without any input before being considered AFK.
-        /// </summary>
-        public static readonly CVarDef<float> AfkTime =
-            CVarDef.Create("afk.time", 60f, CVar.SERVERONLY);
-
-        /*
-         * IC
-         */
-
-        /// <summary>
-        /// Restricts IC character names to alphanumeric chars.
-        /// </summary>
-        public static readonly CVarDef<bool> RestrictedNames =
-            CVarDef.Create("ic.restricted_names", true, CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        /// Allows flavor text (character descriptions)
-        /// </summary>
-        public static readonly CVarDef<bool> FlavorText =
-            CVarDef.Create("ic.flavor_text", false, CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        /// Adds a period at the end of a sentence if the sentence ends in a letter.
-        /// </summary>
-        public static readonly CVarDef<bool> ChatPunctuation =
-            CVarDef.Create("ic.punctuation", false, CVar.SERVER);
-
-        /// <summary>
-        /// Enables automatically forcing IC name rules. Uppercases the first letter of the first and last words of the name
-        /// </summary>
-        public static readonly CVarDef<bool> ICNameCase =
-            CVarDef.Create("ic.name_case", true, CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        /// Whether or not players' characters are randomly generated rather than using their selected characters in the creator.
-        /// </summary>
-        public static readonly CVarDef<bool> ICRandomCharacters =
-            CVarDef.Create("ic.random_characters", false, CVar.SERVER);
-
-        /// <summary>
-        /// A weighted random prototype used to determine the species selected for random characters.
-        /// </summary>
-        public static readonly CVarDef<string> ICRandomSpeciesWeights =
-            CVarDef.Create("ic.random_species_weights", "SpeciesWeights", CVar.SERVER);
-
-        /// <summary>
-        /// Control displaying SSD indicators near players
-        /// </summary>
-        public static readonly CVarDef<bool> ICShowSSDIndicator =
-            CVarDef.Create("ic.show_ssd_indicator", true, CVar.CLIENTONLY);
-
-        /*
-         * Salvage
-         */
-
-        /// <summary>
-        /// Duration for missions
-        /// </summary>
-        public static readonly CVarDef<float>
-            SalvageExpeditionDuration = CVarDef.Create("salvage.expedition_duration", 660f, CVar.REPLICATED);
-
-        /// <summary>
-        /// Cooldown for missions.
-        /// </summary>
-        public static readonly CVarDef<float>
-            SalvageExpeditionCooldown = CVarDef.Create("salvage.expedition_cooldown", 780f, CVar.REPLICATED);
-
-        /*
-         * Flavor
-         */
-
-        /// <summary>
-        ///     Flavor limit. This is to ensure that having a large mass of flavors in
-        ///     some food object won't spam a user with flavors.
-        /// </summary>
-        public static readonly CVarDef<int>
-            FlavorLimit = CVarDef.Create("flavor.limit", 10, CVar.SERVERONLY);
-
-        /*
-         * Mapping
-         */
-
-        /// <summary>
-        ///     Will mapping mode enable autosaves when it's activated?
-        /// </summary>
-        public static readonly CVarDef<bool>
-            AutosaveEnabled = CVarDef.Create("mapping.autosave", true, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Autosave interval in seconds.
-        /// </summary>
-        public static readonly CVarDef<float>
-            AutosaveInterval = CVarDef.Create("mapping.autosave_interval", 600f, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     Directory in server user data to save to. Saves will be inside folders in this directory.
-        /// </summary>
-        public static readonly CVarDef<string>
-            AutosaveDirectory = CVarDef.Create("mapping.autosave_dir", "Autosaves", CVar.SERVERONLY);
-
-
-        /*
-         * Rules
-         */
-
-        /// <summary>
-        /// Time that players have to wait before rules can be accepted.
-        /// </summary>
-        public static readonly CVarDef<float> RulesWaitTime =
-            CVarDef.Create("rules.time", 45f, CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        /// Don't show rules to localhost/loopback interface.
-        /// </summary>
-        public static readonly CVarDef<bool> RulesExemptLocal =
-            CVarDef.Create("rules.exempt_local", true, CVar.SERVERONLY);
-
-
-        /*
-         * Autogeneration
-         */
-
-        public static readonly CVarDef<string> DestinationFile =
-            CVarDef.Create("autogen.destination_file", "", CVar.SERVER | CVar.SERVERONLY);
-
-        /*
-         * Network Resource Manager
-         */
-
-        /// <summary>
-        /// 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.
-        /// </summary>
-        public static readonly CVarDef<bool> ResourceUploadingStoreEnabled =
-            CVarDef.Create("netres.store_enabled", true, CVar.SERVER | CVar.SERVERONLY);
-
-        /// <summary>
-        /// 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.
-        /// </summary>
-        public static readonly CVarDef<int> ResourceUploadingStoreDeletionDays =
-            CVarDef.Create("netres.store_deletion_days", 30, CVar.SERVER | CVar.SERVERONLY);
-
-        /*
-         * Controls
-         */
-
-        /// <summary>
-        /// Deadzone for drag-drop interactions.
-        /// </summary>
-        public static readonly CVarDef<float> DragDropDeadZone =
-            CVarDef.Create("control.drag_dead_zone", 12f, CVar.CLIENTONLY | CVar.ARCHIVE);
-
-        /// <summary>
-        /// Toggles whether the walking key is a toggle or a held key.
-        /// </summary>
-        public static readonly CVarDef<bool> ToggleWalk =
-            CVarDef.Create("control.toggle_walk", false, CVar.CLIENTONLY | CVar.ARCHIVE);
-
-        /*
-         * Interactions
-         */
-
-        // 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.
-
-        /// <summary>
-        /// Maximum number of interactions that a player can perform within <see cref="InteractionRateLimitCount"/> seconds
-        /// </summary>
-        public static readonly CVarDef<int> InteractionRateLimitCount =
-            CVarDef.Create("interaction.rate_limit_count", 5, CVar.SERVER | CVar.REPLICATED);
-
-        /// <seealso cref="InteractionRateLimitCount"/>
-        public static readonly CVarDef<float> InteractionRateLimitPeriod =
-            CVarDef.Create("interaction.rate_limit_period", 0.5f, CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        /// Minimum delay (in seconds) between notifying admins about interaction rate limit violations. A negative
-        /// value disables admin announcements.
-        /// </summary>
-        public static readonly CVarDef<int> InteractionRateLimitAnnounceAdminsDelay =
-            CVarDef.Create("interaction.rate_limit_announce_admins_delay", 120, CVar.SERVERONLY);
-
-        /*
-         * STORAGE
-         */
-
-        /// <summary>
-        /// Whether or not the storage UI is static and bound to the hotbar, or unbound and allowed to be dragged anywhere.
-        /// </summary>
-        public static readonly CVarDef<bool> StaticStorageUI =
-            CVarDef.Create("control.static_storage_ui", true, CVar.CLIENTONLY | CVar.ARCHIVE);
-
-        /// <summary>
-        /// Whether or not the storage window uses a transparent or opaque sprite.
-        /// </summary>
-        public static readonly CVarDef<bool> OpaqueStorageWindow =
-            CVarDef.Create("control.opaque_storage_background", false, CVar.CLIENTONLY | CVar.ARCHIVE);
-
-        /*
-         * UPDATE
-         */
-
-        /// <summary>
-        /// If a server update restart is pending, the delay after the last player leaves before we actually restart. In seconds.
-        /// </summary>
-        public static readonly CVarDef<float> UpdateRestartDelay =
-            CVarDef.Create("update.restart_delay", 20f, CVar.SERVERONLY);
-
-        /*
-         * Ghost
-         */
-
-        /// <summary>
-        /// The time you must spend reading the rules, before the "Request" button is enabled
-        /// </summary>
-        public static readonly CVarDef<float> GhostRoleTime =
-            CVarDef.Create("ghost.role_time", 3f, CVar.REPLICATED | CVar.SERVER);
-
-        /// <summary>
-        /// If ghost role lotteries should be made near-instanteous.
-        /// </summary>
-        public static readonly CVarDef<bool> GhostQuickLottery =
-            CVarDef.Create("ghost.quick_lottery", false, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Whether or not to kill the player's mob on ghosting, when it is in a critical health state.
-        /// </summary>
-        public static readonly CVarDef<bool> GhostKillCrit =
-            CVarDef.Create("ghost.kill_crit", true, CVar.REPLICATED | CVar.SERVER);
-
-        /*
-         * Fire alarm
-         */
-
-        /// <summary>
-        ///     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.
-        /// </summary>
-        public static readonly CVarDef<bool> FireAlarmAllAccess =
-            CVarDef.Create("firealarm.allaccess", true, CVar.SERVERONLY);
-
-        /*
-         * PLAYTIME
-         */
-
-        /// <summary>
-        /// Time between play time autosaves, in seconds.
-        /// </summary>
-        public static readonly CVarDef<float>
-            PlayTimeSaveInterval = CVarDef.Create("playtime.save_interval", 900f, CVar.SERVERONLY);
-
-        /*
-         * INFOLINKS
-         */
-
-        /// <summary>
-        /// Link to Discord server to show in the launcher.
-        /// </summary>
-        public static readonly CVarDef<string> InfoLinksDiscord =
-            CVarDef.Create("infolinks.discord", "", CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        /// Link to website to show in the launcher.
-        /// </summary>
-        public static readonly CVarDef<string> InfoLinksForum =
-            CVarDef.Create("infolinks.forum", "", CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        /// Link to GitHub page to show in the launcher.
-        /// </summary>
-        public static readonly CVarDef<string> InfoLinksGithub =
-            CVarDef.Create("infolinks.github", "", CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        /// Link to website to show in the launcher.
-        /// </summary>
-        public static readonly CVarDef<string> InfoLinksWebsite =
-            CVarDef.Create("infolinks.website", "", CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        /// Link to wiki to show in the launcher.
-        /// </summary>
-        public static readonly CVarDef<string> InfoLinksWiki =
-            CVarDef.Create("infolinks.wiki", "", CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        /// Link to Patreon. Not shown in the launcher currently.
-        /// </summary>
-        public static readonly CVarDef<string> InfoLinksPatreon =
-            CVarDef.Create("infolinks.patreon", "", CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        /// Link to the bug report form.
-        /// </summary>
-        public static readonly CVarDef<string> InfoLinksBugReport =
-            CVarDef.Create("infolinks.bug_report", "", CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        /// Link to site handling ban appeals. Shown in ban disconnect messages.
-        /// </summary>
-        public static readonly CVarDef<string> InfoLinksAppeal =
-            CVarDef.Create("infolinks.appeal", "", CVar.SERVER | CVar.REPLICATED);
-
-        /*
-         * CONFIG
-         */
-
-        // 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.
-
-        /// <summary>
-        /// Configuration presets to load during startup.
-        /// Multiple presets can be separated by comma and are loaded in order.
-        /// </summary>
-        /// <remarks>
-        /// Loaded presets must be located under the <c>ConfigPresets/</c> resource directory and end with the <c>.toml</c> extension.
-        /// Only the file name (without extension) must be given for this variable.
-        /// </remarks>
-        public static readonly CVarDef<string> ConfigPresets =
-            CVarDef.Create("config.presets", "", CVar.SERVERONLY);
-
-        /// <summary>
-        /// 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 <c>DEVELOPMENT</c> set.
-        /// </summary>
-        public static readonly CVarDef<bool> ConfigPresetDevelopment =
-            CVarDef.Create("config.preset_development", true, CVar.SERVERONLY);
-
-        /// <summary>
-        /// Whether to load the preset debug CVars.
-        /// Even when true, these are only loaded if the game is compiled with <c>DEBUG</c> set.
-        /// </summary>
-        public static readonly CVarDef<bool> ConfigPresetDebug =
-            CVarDef.Create("config.preset_debug", true, CVar.SERVERONLY);
-
-        /*
-         * World Generation
-         */
-        /// <summary>
-        ///     Whether or not world generation is enabled.
-        /// </summary>
-        public static readonly CVarDef<bool> WorldgenEnabled =
-            CVarDef.Create("worldgen.enabled", false, CVar.SERVERONLY);
-
-        /// <summary>
-        ///     The worldgen config to use.
-        /// </summary>
-        public static readonly CVarDef<string> WorldgenConfig =
-            CVarDef.Create("worldgen.worldgen_config", "Default", CVar.SERVERONLY);
-
-        /// <summary>
-        ///     The maximum amount of time the entity GC can process, in ms.
-        /// </summary>
-        public static readonly CVarDef<int> GCMaximumTimeMs =
-            CVarDef.Create("entgc.maximum_time_ms", 5, CVar.SERVERONLY);
-
-        /*
-         * Replays
-         */
-
-        /// <summary>
-        ///     Whether or not to record admin chat. If replays are being publicly distributes, this should probably be
-        ///     false.
-        /// </summary>
-        public static readonly CVarDef<bool> ReplayRecordAdminChat =
-            CVarDef.Create("replay.record_admin_chat", false, CVar.ARCHIVE);
-
-        /// <summary>
-        /// Automatically record full rounds as replays.
-        /// </summary>
-        public static readonly CVarDef<bool> ReplayAutoRecord =
-            CVarDef.Create("replay.auto_record", false, CVar.SERVERONLY);
-
-        /// <summary>
-        /// The file name to record automatic replays to. The path is relative to <see cref="CVars.ReplayDirectory"/>.
-        /// </summary>
-        /// <remarks>
-        /// <para>
-        /// If the path includes slashes, directories will be automatically created if necessary.
-        /// </para>
-        /// <para>
-        /// A number of substitutions can be used to automatically fill in the file name: <c>{year}</c>, <c>{month}</c>, <c>{day}</c>, <c>{hour}</c>, <c>{minute}</c>, <c>{round}</c>.
-        /// </para>
-        /// </remarks>
-        public static readonly CVarDef<string> ReplayAutoRecordName =
-            CVarDef.Create("replay.auto_record_name", "{year}_{month}_{day}-{hour}_{minute}-round_{round}.zip", CVar.SERVERONLY);
-
-        /// <summary>
-        /// Path that, if provided, automatic replays are initially recorded in.
-        /// When the recording is done, the file is moved into its final destination.
-        /// Unless this path is rooted, it will be relative to <see cref="CVars.ReplayDirectory"/>.
-        /// </summary>
-        public static readonly CVarDef<string> ReplayAutoRecordTempDir =
-            CVarDef.Create("replay.auto_record_temp_dir", "", CVar.SERVERONLY);
-
-        /*
-         * Miscellaneous
-         */
-
-        public static readonly CVarDef<bool> GatewayGeneratorEnabled =
-            CVarDef.Create("gateway.generator_enabled", true);
-
-        // Clippy!
-        public static readonly CVarDef<string> TippyEntity =
-            CVarDef.Create("tippy.entity", "Tippy", CVar.SERVER | CVar.REPLICATED);
-
-        /// <summary>
-        ///     The number of seconds that must pass for a single entity to be able to point at something again.
-        /// </summary>
-        public static readonly CVarDef<float> PointingCooldownSeconds =
-            CVarDef.Create("pointing.cooldown_seconds", 0.5f, CVar.SERVERONLY);
-
-        /*
-         * DEBUG
-         */
-
-        /// <summary>
-        /// A simple toggle to test <c>OptionsVisualizerComponent</c>.
-        /// </summary>
-        public static readonly CVarDef<bool> DebugOptionVisualizerTest =
-            CVarDef.Create("debug.option_visualizer_test", false, CVar.CLIENTONLY);
-
-        /// <summary>
-        /// Set to true to disable parallel processing in the pow3r solver.
-        /// </summary>
-        public static readonly CVarDef<bool> DebugPow3rDisableParallel =
-            CVarDef.Create("debug.pow3r_disable_parallel", true, CVar.SERVERONLY);
-    }
+/// <summary>
+/// Contains all the CVars used by content.
+/// </summary>
+/// <remarks>
+/// NOTICE FOR FORKS: Put your own CVars in a separate file with a different [CVarDefs] attribute. RT will automatically pick up on it.
+/// </remarks>
+[CVarDefs]
+public sealed partial class CCVars : CVars
+{
+    // Only debug stuff lives here.
+
+    /// <summary>
+    /// A simple toggle to test <c>OptionsVisualizerComponent</c>.
+    /// </summary>
+    public static readonly CVarDef<bool> DebugOptionVisualizerTest =
+        CVarDef.Create("debug.option_visualizer_test", false, CVar.CLIENTONLY);
+
+    /// <summary>
+    /// Set to true to disable parallel processing in the pow3r solver.
+    /// </summary>
+    public static readonly CVarDef<bool> DebugPow3rDisableParallel =
+        CVarDef.Create("debug.pow3r_disable_parallel", true, CVar.SERVERONLY);
 }