2021-01-05 13:00:12 -08:00
using Robust.Shared ;
2020-09-25 21:21:22 +02:00
using Robust.Shared.Configuration ;
2021-06-13 14:52:40 +02:00
namespace Content.Shared.CCVar
2020-09-25 21:21:22 +02:00
{
// ReSharper disable once InconsistentNaming
[CVarDefs]
public sealed class CCVars : CVars
{
2021-12-09 14:22:49 -08:00
/ *
* Server
* /
/// <summary>
/// Change this to have the changelog and rules "last seen" date stored separately.
/// </summary>
public static readonly CVarDef < string > ServerId =
2021-12-15 22:54:04 -08:00
CVarDef . Create ( "server.id" , "unknown_server_id" , CVar . REPLICATED | CVar . SERVER ) ;
2021-12-09 14:22:49 -08:00
2022-05-23 14:43:09 -05:00
/// <summary>
/// Name of the rules txt file in the "Resources/Server Info" dir. Include the extension.
/// </summary>
public static readonly CVarDef < string > RulesFile =
CVarDef . Create ( "server.rules_file" , "Rules.txt" , CVar . REPLICATED | CVar . SERVER ) ;
2022-08-08 16:20:01 -07:00
/// <summary>
/// A loc string for what should be displayed as the title on the Rules window.
/// </summary>
public static readonly CVarDef < string > RulesHeader =
CVarDef . Create ( "server.rules_header" , "ui-rules-header" , CVar . REPLICATED | CVar . SERVER ) ;
2021-09-07 18:47:23 +10:00
/ *
* Ambience
* /
2021-09-15 03:58:45 -07:00
/// <summary>
2022-03-19 23:45:51 -05:00
/// 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.
2021-09-15 03:58:45 -07:00
/// </summary>
2022-03-19 23:45:51 -05:00
public static readonly CVarDef < float > AmbientCooldown =
CVarDef . Create ( "ambience.cooldown" , 0.1f , CVar . ARCHIVE | CVar . CLIENTONLY ) ;
2021-09-15 03:58:45 -07:00
2021-09-07 18:47:23 +10:00
/// <summary>
2022-03-19 23:45:51 -05:00
/// How large of a range to sample for ambience.
2021-09-07 18:47:23 +10:00
/// </summary>
public static readonly CVarDef < float > AmbientRange =
2022-11-28 14:10:40 +13:00
CVarDef . Create ( "ambience.range" , 8f , CVar . REPLICATED | CVar . SERVER ) ;
2021-09-07 18:47:23 +10:00
2022-03-19 23:45:51 -05:00
/// <summary>
/// Maximum simultaneous ambient sounds.
/// </summary>
2021-09-07 18:47:23 +10:00
public static readonly CVarDef < int > MaxAmbientSources =
2022-03-19 23:45:51 -05:00
CVarDef . Create ( "ambience.max_sounds" , 16 , CVar . ARCHIVE | CVar . CLIENTONLY ) ;
2021-09-07 18:47:23 +10:00
2022-03-19 23:45:51 -05:00
/// <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 =
2024-01-01 00:57:33 -07:00
CVarDef . Create ( "ambience.volume" , 1.5f , CVar . ARCHIVE | CVar . CLIENTONLY ) ;
2022-11-04 00:15:37 +00:00
2022-05-17 23:21:16 -05:00
/// <summary>
2023-05-29 10:44:11 +10:00
/// Ambience music volume.
2022-05-17 23:21:16 -05:00
/// </summary>
2023-05-29 10:44:11 +10:00
public static readonly CVarDef < float > AmbientMusicVolume =
2024-01-01 00:57:33 -07:00
CVarDef . Create ( "ambience.music_volume" , 1.5f , CVar . ARCHIVE | CVar . CLIENTONLY ) ;
2022-05-17 23:21:16 -05:00
/// <summary>
2023-05-29 10:44:11 +10:00
/// Lobby / round end music volume.
2022-05-17 23:21:16 -05:00
/// </summary>
2023-05-29 10:44:11 +10:00
public static readonly CVarDef < float > LobbyMusicVolume =
2023-12-09 14:03:08 +11:00
CVarDef . Create ( "ambience.lobby_music_volume" , 0.50f , CVar . ARCHIVE | CVar . CLIENTONLY ) ;
2022-05-17 23:21:16 -05:00
2023-12-29 15:43:36 +11:00
/// <summary>
/// UI volume.
/// </summary>
public static readonly CVarDef < float > InterfaceVolume =
CVarDef . Create ( "audio.interface_volume" , 0.50f , CVar . ARCHIVE | CVar . CLIENTONLY ) ;
2020-11-07 01:15:56 +01:00
/ *
* Status
* /
public static readonly CVarDef < string > StatusMoMMIUrl =
2020-12-19 02:34:41 +01:00
CVarDef . Create ( "status.mommiurl" , "" , CVar . SERVERONLY ) ;
2020-11-07 01:15:56 +01:00
public static readonly CVarDef < string > StatusMoMMIPassword =
2022-08-10 07:42:31 +02:00
CVarDef . Create ( "status.mommipassword" , "" , CVar . SERVERONLY | CVar . CONFIDENTIAL ) ;
2020-11-07 01:15:56 +01:00
/ *
2022-10-18 19:51:47 -07:00
* Events
2020-11-07 01:15:56 +01:00
* /
2021-12-01 04:43:44 -06:00
/// <summary>
/// Controls if the game should run station events
/// </summary>
2020-11-06 04:04:07 +11:00
public static readonly CVarDef < bool >
2021-11-22 16:33:30 -06:00
EventsEnabled = CVarDef . Create ( "events.enabled" , true , CVar . ARCHIVE | CVar . SERVERONLY ) ;
2020-11-06 04:04:07 +11:00
2022-10-18 19:51:47 -07:00
/// <summary>
/// Average time (in minutes) for when the ramping event scheduler should stop increasing the chaos modifier.
/// Close to how long you expect a round to last, so you'll probably have to tweak this on downstreams.
/// </summary>
public static readonly CVarDef < float >
EventsRampingAverageEndTime = CVarDef . Create ( "events.ramping_average_end_time" , 40f , CVar . ARCHIVE | CVar . SERVERONLY ) ;
/// <summary>
/// Average ending chaos modifier for the ramping event scheduler.
/// Max chaos chosen for a round will deviate from this
/// </summary>
public static readonly CVarDef < float >
EventsRampingAverageChaos = CVarDef . Create ( "events.ramping_average_chaos" , 6f , CVar . ARCHIVE | CVar . SERVERONLY ) ;
/ *
* Game
* /
2022-03-04 23:25:41 +01:00
/// <summary>
/// Disables most functionality in the GameTicker.
/// </summary>
2021-06-20 10:09:24 +02:00
public static readonly CVarDef < bool >
GameDummyTicker = CVarDef . Create ( "game.dummyticker" , false , CVar . ARCHIVE | CVar . SERVERONLY ) ;
2021-12-01 04:43:44 -06:00
/// <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>
2020-09-25 21:21:22 +02:00
public static readonly CVarDef < bool >
2022-12-16 23:26:24 +01:00
GameLobbyEnabled = CVarDef . Create ( "game.lobbyenabled" , true , CVar . ARCHIVE ) ;
2020-09-25 21:21:22 +02:00
2021-12-01 04:43:44 -06:00
/// <summary>
/// Controls the duration of the lobby timer in seconds. Defaults to 2 minutes and 30 seconds.
/// </summary>
2020-09-25 21:21:22 +02:00
public static readonly CVarDef < int >
2021-11-24 03:52:07 -06:00
GameLobbyDuration = CVarDef . Create ( "game.lobbyduration" , 150 , CVar . ARCHIVE ) ;
2020-09-25 21:21:22 +02:00
2021-12-01 04:43:44 -06:00
/// <summary>
/// Controls if players can latejoin at all.
/// </summary>
2021-06-20 10:09:24 +02:00
public static readonly CVarDef < bool >
GameDisallowLateJoins = CVarDef . Create ( "game.disallowlatejoins" , false , CVar . ARCHIVE | CVar . SERVERONLY ) ;
2021-12-01 04:43:44 -06:00
/// <summary>
/// Controls the default game preset.
/// </summary>
2020-09-25 21:21:22 +02:00
public static readonly CVarDef < string >
2022-06-07 12:44:34 +10:00
GameLobbyDefaultPreset = CVarDef . Create ( "game.defaultpreset" , "secret" , CVar . ARCHIVE ) ;
2020-09-25 21:21:22 +02:00
2021-12-01 04:43:44 -06:00
/// <summary>
/// Controls if the game can force a different preset if the current preset's criteria are not met.
/// </summary>
2020-10-17 13:39:23 +02:00
public static readonly CVarDef < bool >
GameLobbyFallbackEnabled = CVarDef . Create ( "game.fallbackenabled" , true , CVar . ARCHIVE ) ;
2021-12-01 04:43:44 -06:00
/// <summary>
/// The preset for the game to fall back to if the selected preset could not be used, and fallback is enabled.
/// </summary>
2020-09-25 21:21:22 +02:00
public static readonly CVarDef < string >
2023-06-08 00:16:18 -07:00
GameLobbyFallbackPreset = CVarDef . Create ( "game.fallbackpreset" , "Traitor,Extended" , CVar . ARCHIVE ) ;
2020-09-25 21:21:22 +02:00
2021-12-01 04:43:44 -06:00
/// <summary>
/// Controls if people can win the game in Suspicion or Deathmatch.
/// </summary>
2020-09-25 21:21:22 +02:00
public static readonly CVarDef < bool >
GameLobbyEnableWin = CVarDef . Create ( "game.enablewin" , true , CVar . ARCHIVE ) ;
2020-09-29 14:26:00 +02:00
2021-12-01 04:43:44 -06:00
/// <summary>
/// Controls the maximum number of character slots a player is allowed to have.
/// </summary>
2020-09-29 14:26:00 +02:00
public static readonly CVarDef < int >
GameMaxCharacterSlots = CVarDef . Create ( "game.maxcharacterslots" , 10 , CVar . ARCHIVE | CVar . SERVERONLY ) ;
2021-12-01 04:43:44 -06:00
/// <summary>
/// Controls the game map prototype to load. SS14 stores these prototypes in Prototypes/Maps.
/// </summary>
2020-11-15 04:08:58 +01:00
public static readonly CVarDef < string >
2022-11-07 18:18:21 -08:00
GameMap = CVarDef . Create ( "game.map" , string . Empty , CVar . SERVERONLY ) ;
2021-12-01 04:43:44 -06:00
2023-12-17 03:55:19 +00:00
/// <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 ) ;
2022-11-01 21:17:35 -04:00
/// <summary>
/// Prototype to use for map pool.
/// </summary>
public static readonly CVarDef < string >
GameMapPool = CVarDef . Create ( "game.map_pool" , "DefaultMapPool" , CVar . SERVERONLY ) ;
2022-03-17 13:59:53 -05:00
/// <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 >
2023-01-19 03:56:45 +01:00
GameMapRotation = CVarDef . Create ( "game.map_rotation" , true , CVar . SERVERONLY ) ;
2022-03-17 13:59:53 -05:00
2022-08-07 08:00:42 +02:00
/// <summary>
/// If roles should be restricted based on time.
/// </summary>
public static readonly CVarDef < bool >
2022-08-13 14:14:56 +10:00
GameRoleTimers = CVarDef . Create ( "game.role_timers" , true , CVar . SERVER | CVar . REPLICATED ) ;
2022-08-07 08:00:42 +02:00
2024-01-15 01:35:28 -05:00
/// <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 ) ;
2021-08-04 09:25:30 +02:00
/// <summary>
/// Whether a random position offset will be applied to the station on roundstart.
/// </summary>
public static readonly CVarDef < bool > StationOffset =
2021-08-07 00:19:10 +10:00
CVarDef . Create ( "game.station_offset" , true ) ;
2021-08-04 09:25:30 +02:00
2021-08-03 18:49:25 +10:00
/// <summary>
/// When the default blueprint is loaded what is the maximum amount it can be offset from 0,0.
2021-08-07 00:19:10 +10:00
/// Does nothing without <see cref="StationOffset"/> as true.
2021-08-03 18:49:25 +10:00
/// </summary>
public static readonly CVarDef < float > MaxStationOffset =
CVarDef . Create ( "game.maxstationoffset" , 1000.0f ) ;
2021-10-25 15:22:57 +11:00
/// <summary>
/// Whether a random rotation will be applied to the station on roundstart.
/// </summary>
public static readonly CVarDef < bool > StationRotation =
2022-04-15 16:35:58 -05:00
CVarDef . Create ( "game.station_rotation" , true ) ;
2021-10-25 15:22:57 +11:00
2020-09-29 14:26:00 +02:00
/// <summary>
/// When enabled, guests will be assigned permanent UIDs and will have their preferences stored.
/// </summary>
2021-11-09 03:44:39 -06:00
public static readonly CVarDef < bool > GamePersistGuests =
CVarDef . Create ( "game.persistguests" , true , CVar . ARCHIVE | CVar . SERVERONLY ) ;
2020-09-29 14:26:00 +02:00
2020-12-01 17:05:19 +01:00
public static readonly CVarDef < bool > GameDiagonalMovement =
CVarDef . Create ( "game.diagonalmovement" , true , CVar . ARCHIVE ) ;
2020-11-07 01:15:56 +01:00
2021-11-09 03:44:39 -06:00
public static readonly CVarDef < int > SoftMaxPlayers =
CVarDef . Create ( "game.soft_max_players" , 30 , CVar . SERVERONLY | CVar . ARCHIVE ) ;
2024-03-14 09:00:47 +01:00
/// <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 ) ;
2022-07-01 15:46:37 -05:00
/// <summary>
/// Whether or not panic bunker is currently enabled.
/// </summary>
public static readonly CVarDef < bool > PanicBunkerEnabled =
2024-01-03 03:26:13 -06:00
CVarDef . Create ( "game.panic_bunker.enabled" , false , CVar . NOTIFY | CVar . REPLICATED | CVar . SERVER ) ;
2022-07-01 15:46:37 -05:00
2023-10-13 11:56:12 -07:00
/// <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 ) ;
2022-12-01 19:41:47 +03:00
/// <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 ) ;
2022-07-01 15:46:37 -05:00
/// <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 ) ;
2022-12-01 19:41:47 +03:00
/// <summary>
/// Minimal overall played time.
/// </summary>
public static readonly CVarDef < int > PanicBunkerMinOverallHours =
CVarDef . Create ( "game.panic_bunker.min_overall_hours" , 10 , CVar . SERVERONLY ) ;
2023-12-31 18:53:49 -08:00
/// <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 ) ;
2024-01-14 06:27:32 +01:00
/// <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 ) ;
2022-08-25 15:41:37 +02:00
/// <summary>
/// Make people bonk when trying to climb certain objects like tables.
/// </summary>
public static readonly CVarDef < bool > GameTableBonk =
2023-04-17 04:15:36 +12:00
CVarDef . Create ( "game.table_bonk" , false , CVar . REPLICATED ) ;
2022-08-25 15:41:37 +02:00
2023-06-27 20:31:53 -04:00
/// <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 ) ;
2023-07-03 21:31:52 +00:00
/// <summary>
/// Whether or not coordinates on the Debug overlay should only be available to admins.
/// </summary>
public static readonly CVarDef < bool > DebugCoordinatesAdminOnly =
2023-07-04 07:30:57 +00:00
CVarDef . Create ( "game.debug_coordinates_admin_only" , true , CVar . SERVER | CVar . REPLICATED ) ;
2023-07-03 21:31:52 +00:00
2022-03-04 23:25:41 +01:00
#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
2023-06-24 14:01:14 +02:00
/// <summary>
/// Delay between station alert level changes.
/// </summary>
public static readonly CVarDef < int > GameAlertLevelChangeDelay =
CVarDef . Create ( "game.alert_level_change_delay" , 30 , CVar . SERVERONLY ) ;
2023-08-16 03:36:50 +02:00
/// <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 ) ;
2024-01-05 15:30:00 -08:00
/// <summary>
2024-01-06 09:06:49 +03:00
/// The prototype to use for secret weights.
2024-01-05 15:30:00 -08:00
/// </summary>
public static readonly CVarDef < string > SecretWeightPrototype =
CVarDef . Create ( "game.secret_weight_prototype" , "Secret" , CVar . SERVERONLY ) ;
2024-03-01 02:08:48 -08:00
/// <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 ) ;
2021-12-22 13:34:09 +01:00
/ *
* Discord
* /
2022-09-11 17:43:38 +02:00
/// <summary>
/// URL of the Discord webhook which will relay all ahelp messages.
/// </summary>
2021-12-22 13:34:09 +01:00
public static readonly CVarDef < string > DiscordAHelpWebhook =
2023-08-25 14:14:04 -07:00
CVarDef . Create ( "discord.ahelp_webhook" , string . Empty , CVar . SERVERONLY | CVar . CONFIDENTIAL ) ;
2021-12-22 13:34:09 +01:00
2022-09-11 17:43:38 +02:00
/// <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 ) ;
2023-08-24 14:50:07 -07:00
/// <summary>
2023-12-15 09:57:46 -07:00
/// URL of the Discord webhook which will relay all custom votes. If left empty, disables the webhook.
2023-12-14 20:03:32 -08:00
/// </summary>
public static readonly CVarDef < string > DiscordVoteWebhook =
CVarDef . Create ( "discord.vote_webhook" , string . Empty , CVar . SERVERONLY ) ;
2023-08-24 14:50:07 -07:00
/// URL of the Discord webhook which will relay round restart messages.
/// </summary>
2023-08-25 05:53:32 +03:00
public static readonly CVarDef < string > DiscordRoundUpdateWebhook =
2023-08-25 14:14:04 -07:00
CVarDef . Create ( "discord.round_update_webhook" , string . Empty , CVar . SERVERONLY | CVar . CONFIDENTIAL ) ;
2023-08-24 14:50:07 -07:00
/// <summary>
/// Role id for the Discord webhook to ping when the round ends.
/// </summary>
2023-08-25 05:53:32 +03:00
public static readonly CVarDef < string > DiscordRoundEndRoleWebhook =
CVarDef . Create ( "discord.round_end_role" , string . Empty , CVar . SERVERONLY ) ;
2023-08-24 14:50:07 -07:00
2023-12-14 20:03:32 -08:00
2020-12-01 17:05:19 +01:00
/ *
* Suspicion
* /
2020-11-07 01:15:56 +01:00
2020-12-01 17:05:19 +01:00
public static readonly CVarDef < int > SuspicionMinPlayers =
CVarDef . Create ( "suspicion.min_players" , 5 ) ;
2020-11-07 01:15:56 +01:00
2020-12-01 17:05:19 +01:00
public static readonly CVarDef < int > SuspicionMinTraitors =
CVarDef . Create ( "suspicion.min_traitors" , 2 ) ;
2020-11-07 01:15:56 +01:00
2020-12-01 17:05:19 +01:00
public static readonly CVarDef < int > SuspicionPlayersPerTraitor =
2022-07-28 20:59:45 -04:00
CVarDef . Create ( "suspicion.players_per_traitor" , 6 ) ;
2020-12-01 17:05:19 +01:00
public static readonly CVarDef < int > SuspicionStartingBalance =
CVarDef . Create ( "suspicion.starting_balance" , 20 ) ;
2020-12-03 01:49:22 +01:00
public static readonly CVarDef < int > SuspicionMaxTimeSeconds =
CVarDef . Create ( "suspicion.max_time_seconds" , 300 ) ;
2020-12-01 17:05:19 +01:00
/ *
* Traitor
* /
public static readonly CVarDef < int > TraitorMinPlayers =
CVarDef . Create ( "traitor.min_players" , 5 ) ;
public static readonly CVarDef < int > TraitorMaxTraitors =
2022-07-28 20:59:45 -04:00
CVarDef . Create ( "traitor.max_traitors" , 12 ) ; // Assuming average server maxes somewhere from like 50-80 people
2020-12-01 17:05:19 +01:00
public static readonly CVarDef < int > TraitorPlayersPerTraitor =
2022-08-01 17:36:01 +08:00
CVarDef . Create ( "traitor.players_per_traitor" , 10 ) ;
2020-12-01 17:05:19 +01:00
public static readonly CVarDef < int > TraitorCodewordCount =
CVarDef . Create ( "traitor.codeword_count" , 4 ) ;
public static readonly CVarDef < int > TraitorStartingBalance =
CVarDef . Create ( "traitor.starting_balance" , 20 ) ;
public static readonly CVarDef < int > TraitorMaxDifficulty =
2022-01-30 09:19:27 -05:00
CVarDef . Create ( "traitor.max_difficulty" , 5 ) ;
2020-12-01 17:05:19 +01:00
public static readonly CVarDef < int > TraitorMaxPicks =
CVarDef . Create ( "traitor.max_picks" , 20 ) ;
2020-11-07 01:15:56 +01:00
2023-01-20 11:18:47 -05:00
public static readonly CVarDef < float > TraitorStartDelay =
CVarDef . Create ( "traitor.start_delay" , 4f * 60f ) ;
public static readonly CVarDef < float > TraitorStartDelayVariance =
CVarDef . Create ( "traitor.start_delay_variance" , 3f * 60f ) ;
2020-12-13 15:00:49 +00:00
/ *
* TraitorDeathMatch
* /
public static readonly CVarDef < int > TraitorDeathMatchStartingBalance =
CVarDef . Create ( "traitordm.starting_balance" , 20 ) ;
2022-07-05 23:42:51 -04:00
/ *
* Zombie
* /
public static readonly CVarDef < int > ZombieMinPlayers =
CVarDef . Create ( "zombie.min_players" , 20 ) ;
2022-06-03 10:56:11 -05:00
/ *
* Pirates
* /
public static readonly CVarDef < int > PiratesMinPlayers =
CVarDef . Create ( "pirates.min_players" , 25 ) ;
public static readonly CVarDef < int > PiratesMaxOps =
CVarDef . Create ( "pirates.max_pirates" , 6 ) ;
public static readonly CVarDef < int > PiratesPlayersPerOp =
CVarDef . Create ( "pirates.players_per_pirate" , 5 ) ;
Refactor antag rule code (#23445)
* Initial Pass, Rev, Thief
* Zombie initial pass
* Rebase, Traitor
* Nukeops, More overloads
* Revert RevolutionaryRuleComponent
* Use TryRoundStartAttempt, Rewrite nukie spawning
* Comments, Add task scheduler to GameRuleSystem
* Zombie initial testing done
* Sort methods, rework GameRuleTask
* Add CCVar, Initial testing continues
* Might as well get rid of the obsolete logging
* Oops, i dont know how to log apparently
* Suggested formatting fixes
* Suggested changes
* Fix merge issues
* Minor optimisation
* Allowed thief to choose other antags
* Review changes
* Spawn items on floor first, then inserting
* minor tweaks
* Shift as much as possible to ProtoId<>
* Remove unneeded
* Add exclusive antag attribute
* Fix merge issues
* Minor formatting fix
* Convert to struct
* Cleanup
* Review cleanup (need to test a lot)
* Some fixes, (mostly) tested
* oop
* Pass tests (for real)
---------
Co-authored-by: Rainfall <rainfey0+git@gmail.com>
Co-authored-by: AJCM <AJCM@tutanota.com>
2024-02-29 06:25:10 +00:00
/ *
* Nukeops
* /
public static readonly CVarDef < bool > NukeopsSpawnGhostRoles =
CVarDef . Create ( "nukeops.spawn_ghost_roles" , false ) ;
2023-01-16 10:52:52 -06:00
/ *
* 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 =
2023-01-17 12:43:51 -06:00
CVarDef . Create ( "tips.out_of_game_frequency" , 60f * 1.5f ) ;
2023-01-16 10:52:52 -06:00
/// <summary>
/// The number of seconds between each tip being displayed when the round is actively going
/// </summary>
public static readonly CVarDef < float > TipFrequencyInRound =
2023-01-17 12:43:51 -06:00
CVarDef . Create ( "tips.in_game_frequency" , 60f * 60 ) ;
2023-01-16 10:52:52 -06:00
2024-01-06 09:06:49 +03:00
public static readonly CVarDef < string > LoginTipsDataset =
CVarDef . Create ( "tips.login_dataset" , "Tips" ) ;
2020-11-10 16:59:17 +01:00
/ *
* Console
* /
2020-10-30 16:06:48 +01:00
public static readonly CVarDef < bool >
2020-11-02 00:10:07 +01:00
ConsoleLoginLocal = CVarDef . Create ( "console.loginlocal" , true , CVar . ARCHIVE | CVar . SERVERONLY ) ;
2020-10-30 16:06:48 +01:00
2023-06-26 05:01:30 +02:00
/// <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 ) ;
2020-09-29 14:26:00 +02:00
/ *
* 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 ) ;
2022-03-04 23:55:35 +01:00
/// <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 ) ;
2023-05-02 02:36:39 +02:00
/// <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 ) ;
2022-03-04 23:55:35 +01:00
#if DEBUG
private const int DefaultSqliteDelay = 1 ;
#else
private const int DefaultSqliteDelay = 0 ;
#endif
2020-09-29 14:26:00 +02:00
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 =
2022-10-04 14:24:19 +11:00
CVarDef . Create ( "database.pg_username" , "postgres" , CVar . SERVERONLY ) ;
2020-09-29 14:26:00 +02:00
public static readonly CVarDef < string > DatabasePgPassword =
2022-08-10 07:42:31 +02:00
CVarDef . Create ( "database.pg_password" , "" , CVar . SERVERONLY | CVar . CONFIDENTIAL ) ;
2020-11-02 00:04:58 +01:00
2023-06-10 13:52:08 +02:00
/// <summary>
/// Max amount of concurrent Postgres database operations.
/// </summary>
public static readonly CVarDef < int > DatabasePgConcurrency =
CVarDef . Create ( "database.pg_concurrency" , 8 , CVar . SERVERONLY ) ;
2023-12-10 16:30:12 +01:00
/// <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 ) ;
2020-12-30 01:18:39 +01:00
// Basically only exists for integration tests to avoid race conditions.
public static readonly CVarDef < bool > DatabaseSynchronous =
CVarDef . Create ( "database.sync" , false , CVar . SERVERONLY ) ;
2023-12-29 15:43:36 +11:00
/ *
* 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 ) ;
2020-11-07 01:15:56 +01:00
/ *
* Outline
* /
public static readonly CVarDef < bool > OutlineEnabled =
CVarDef . Create ( "outline.enabled" , true , CVar . CLIENTONLY ) ;
/ *
* Parallax
* /
public static readonly CVarDef < bool > ParallaxEnabled =
2020-12-04 11:04:43 +01:00
CVarDef . Create ( "parallax.enabled" , true , CVar . CLIENTONLY ) ;
2020-11-07 01:15:56 +01:00
public static readonly CVarDef < bool > ParallaxDebug =
2020-12-04 11:04:43 +01:00
CVarDef . Create ( "parallax.debug" , false , CVar . CLIENTONLY ) ;
2020-11-07 01:15:56 +01:00
2022-05-04 17:55:21 +01:00
public static readonly CVarDef < bool > ParallaxLowQuality =
CVarDef . Create ( "parallax.low_quality" , false , CVar . ARCHIVE | CVar . CLIENTONLY ) ;
2021-03-08 04:09:59 +11:00
/ *
* Physics
* /
2021-07-26 01:48:22 +10:00
/// <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 ) ;
2021-03-08 04:09:59 +11:00
public static readonly CVarDef < float > TileFrictionModifier =
2022-06-23 12:13:22 +10:00
CVarDef . Create ( "physics.tile_friction" , 40.0f , CVar . ARCHIVE | CVar . REPLICATED ) ;
2021-03-08 04:09:59 +11:00
public static readonly CVarDef < float > StopSpeed =
2022-06-23 12:13:22 +10:00
CVarDef . Create ( "physics.stop_speed" , 0.1f , CVar . ARCHIVE | CVar . REPLICATED ) ;
2020-11-07 01:15:56 +01:00
2021-07-25 16:58:11 +10:00
/// <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 =
2022-03-03 13:32:03 +11:00
CVarDef . Create ( "physics.mob_pushing" , false , CVar . REPLICATED ) ;
2021-07-25 16:58:11 +10:00
2021-03-12 16:40:28 -06:00
/ *
2022-07-04 01:29:38 -05:00
* Music
2021-03-12 16:40:28 -06:00
* /
public static readonly CVarDef < bool > LobbyMusicEnabled =
2022-07-04 01:29:38 -05:00
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 ) ;
2021-02-21 05:02:23 -08:00
2022-08-03 17:43:54 -07:00
/ *
* Specific Sounds
* /
// Round end sound (APC Destroyed)
public static readonly CVarDef < bool > RestartSoundsEnabled =
CVarDef . Create ( "ambience.restart_sounds_enabled" , true , CVar . ARCHIVE | CVar . CLIENTONLY ) ;
2022-06-02 08:41:19 -05:00
/ *
* Admin sounds
* /
public static readonly CVarDef < bool > AdminSoundsEnabled =
2022-07-04 01:29:38 -05:00
CVarDef . Create ( "audio.admin_sounds_enabled" , true , CVar . ARCHIVE | CVar . CLIENTONLY ) ;
2022-12-19 21:39:01 -06:00
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 ) ;
2023-12-13 01:51:30 -07:00
public static readonly CVarDef < string > AHelpSound =
CVarDef . Create ( "audio.ahelp_sound" , "/Audio/Effects/adminhelp.ogg" , CVar . ARCHIVE | CVar . CLIENTONLY ) ;
2022-06-02 08:41:19 -05:00
2021-04-11 17:43:53 -05:00
/ *
* HUD
* /
public static readonly CVarDef < int > HudTheme =
CVarDef . Create ( "hud.theme" , 0 , CVar . ARCHIVE | CVar . CLIENTONLY ) ;
2021-10-22 04:26:02 +02:00
public static readonly CVarDef < bool > HudHeldItemShow =
CVarDef . Create ( "hud.held_item_show" , true , CVar . ARCHIVE | CVar . CLIENTONLY ) ;
2023-05-06 08:06:42 +03:00
public static readonly CVarDef < bool > CombatModeIndicatorsPointShow =
CVarDef . Create ( "hud.combat_mode_indicators_point_show" , true , CVar . ARCHIVE | CVar . CLIENTONLY ) ;
2023-11-09 10:18:58 +01:00
public static readonly CVarDef < bool > LoocAboveHeadShow =
CVarDef . Create ( "hud.show_looc_above_head" , true , CVar . ARCHIVE | CVar . CLIENTONLY ) ;
2021-10-22 04:26:02 +02:00
public static readonly CVarDef < float > HudHeldItemOffset =
CVarDef . Create ( "hud.held_item_offset" , 28f , CVar . ARCHIVE | CVar . CLIENTONLY ) ;
2021-11-30 14:31:13 +03:00
public static readonly CVarDef < bool > HudFpsCounterVisible =
CVarDef . Create ( "hud.fps_counter_visible" , false , CVar . CLIENTONLY | CVar . ARCHIVE ) ;
2021-10-22 04:26:02 +02:00
2020-11-07 01:15:56 +01:00
/ *
2021-12-05 14:08:35 +11:00
* NPCs
2020-11-07 01:15:56 +01:00
* /
2021-12-05 14:08:35 +11:00
public static readonly CVarDef < int > NPCMaxUpdates =
2022-09-30 14:39:48 +10:00
CVarDef . Create ( "npc.max_updates" , 128 ) ;
2020-11-07 01:15:56 +01:00
2021-12-05 14:08:35 +11:00
public static readonly CVarDef < bool > NPCEnabled = CVarDef . Create ( "npc.enabled" , true ) ;
2020-11-07 01:15:56 +01:00
2022-12-12 14:33:43 +11:00
/// <summary>
/// Should NPCs pathfind when steering. For debug purposes.
/// </summary>
public static readonly CVarDef < bool > NPCPathfinding = CVarDef . Create ( "npc.pathfinding" , true ) ;
2020-11-07 01:15:56 +01:00
/ *
* 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 ) ;
2020-11-10 16:59:17 +01:00
2021-06-21 17:08:37 +10:00
public static readonly CVarDef < int > GasOverlayThresholds =
CVarDef . Create ( "net.gasoverlaythresholds" , 20 ) ;
2020-11-02 00:04:58 +01:00
/ *
2023-07-21 13:38:52 +02:00
* Admin
2020-11-02 00:04:58 +01:00
* /
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 ) ;
2020-11-27 16:24:19 +01:00
2023-07-21 13:38:52 +02:00
/// <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 ) ;
2024-03-23 19:46:45 -07:00
/// <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 ) ;
2023-07-21 13:38:52 +02:00
/// <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 ) ;
/// <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 ) ;
/// <summary>
/// Default severity for server bans
/// </summary>
public static readonly CVarDef < string > ServerBanDefaultSeverity =
2024-02-20 10:13:31 +01:00
CVarDef . Create ( "admin.server_ban_default_severity" , "High" , CVar . ARCHIVE | CVar . SERVER ) ;
2023-07-21 13:38:52 +02:00
2023-04-27 13:55:16 -05:00
/// <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 ) ;
2023-08-07 10:07:57 -07:00
/// <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" , 3 , CVar . SERVERONLY ) ;
2023-07-29 20:14:56 +03:00
/// <summary>
/// Should the ban details in admin channel include PII? (IP, HWID, etc)
public static readonly CVarDef < bool > AdminShowPIIOnBan =
CVarDef . Create ( "admin.show_pii_onban" , false , CVar . SERVERONLY ) ;
2023-07-31 12:13:38 -07:00
/// <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 ) ;
2023-12-20 00:40:37 +01:00
/// <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 ) ;
2024-01-03 20:45:23 -08:00
/// <summary>
/// The threshold of minutes to appear as a "new player" in the ahelp menu
2024-01-06 09:06:49 +03:00
/// If 0, appearing as a new player is disabled.
2024-01-03 20:45:23 -08:00
/// </summary>
public static readonly CVarDef < int > NewPlayerThreshold =
CVarDef . Create ( "admin.new_player_threshold" , 0 , CVar . ARCHIVE | CVar . REPLICATED | CVar . SERVER ) ;
2024-02-02 02:03:49 +13:00
/// <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 ) ;
2024-03-14 09:00:47 +01:00
/// <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 ) ;
2022-04-01 15:39:26 +13:00
/ *
* 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
2022-04-15 16:35:58 -05:00
/// incrementally.
2022-04-01 15:39:26 +13:00
/// </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 =
2022-07-04 23:49:19 -07:00
CVarDef . Create ( "explosion.max_area" , ( int ) 3.14f * 256 * 256 , CVar . SERVERONLY ) ;
2022-04-01 15:39:26 +13:00
/// <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 =
2022-07-04 23:49:19 -07:00
CVarDef . Create ( "explosion.max_iterations" , 500 , CVar . SERVERONLY ) ;
2022-04-01 15:39:26 +13:00
/// <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>
2022-11-27 23:24:35 +13:00
/// This determines for how many seconds an explosion should stay visible once it has finished expanding.
2022-04-01 15:39:26 +13:00
/// </summary>
public static readonly CVarDef < float > ExplosionPersistence =
2023-12-15 09:57:46 -07:00
CVarDef . Create ( "explosion.persistence" , 1.0f , CVar . SERVERONLY ) ;
2022-04-01 15:39:26 +13:00
/// <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 ) ;
2022-10-11 05:09:10 +02:00
/ *
* 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 ) ;
2021-11-22 19:08:27 +01:00
/ *
* Admin logs
* /
2021-12-01 04:43:44 -06:00
/// <summary>
/// Controls if admin logs are enabled. Highly recommended to shut this off for development.
/// </summary>
2021-11-26 00:11:25 +01:00
public static readonly CVarDef < bool > AdminLogsEnabled =
CVarDef . Create ( "adminlogs.enabled" , true , CVar . SERVERONLY ) ;
2021-11-22 19:08:27 +01:00
public static readonly CVarDef < float > AdminLogsQueueSendDelay =
CVarDef . Create ( "adminlogs.queue_send_delay_seconds" , 5f , CVar . SERVERONLY ) ;
2023-08-16 00:12:10 -07:00
// When to skip the waiting time to save in-round admin logs, if no admin logs are currently being saved
2021-11-22 19:08:27 +01:00
public static readonly CVarDef < int > AdminLogsQueueMax =
CVarDef . Create ( "adminlogs.queue_max" , 5000 , CVar . SERVERONLY ) ;
2021-11-24 18:52:16 +01:00
2023-08-16 00:12:10 -07:00
// When to skip the waiting time to save pre-round admin logs, if no admin logs are currently being saved
2021-11-24 18:52:16 +01:00
public static readonly CVarDef < int > AdminLogsPreRoundQueueMax =
CVarDef . Create ( "adminlogs.pre_round_queue_max" , 5000 , CVar . SERVERONLY ) ;
2021-11-22 19:08:27 +01:00
2023-08-16 00:12:10 -07:00
// When to start dropping logs
public static readonly CVarDef < int > AdminLogsDropThreshold =
CVarDef . Create ( "adminlogs.drop_threshold" , 20000 , CVar . SERVERONLY ) ;
2021-11-22 19:08:27 +01:00
// 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 ) ;
2022-03-13 18:36:48 +01:00
public static readonly CVarDef < string > AdminLogsServerName =
CVarDef . Create ( "adminlogs.server_name" , "unknown" , CVar . SERVERONLY ) ;
2020-11-27 16:49:12 +01:00
/ *
* Atmos
* /
/// <summary>
/// Whether gas differences will move entities.
/// </summary>
public static readonly CVarDef < bool > SpaceWind =
2023-11-27 15:42:29 -06:00
CVarDef . Create ( "atmos.space_wind" , false , CVar . SERVERONLY ) ;
2020-11-27 16:49:12 +01:00
2022-04-18 15:42:32 +01:00
/// <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 ) ;
2020-11-27 16:49:12 +01:00
/// <summary>
/// Whether monstermos tile equalization is enabled.
/// </summary>
public static readonly CVarDef < bool > MonstermosEqualization =
CVarDef . Create ( "atmos.monstermos_equalization" , true , CVar . SERVERONLY ) ;
2021-07-20 18:03:49 +02:00
/// <summary>
/// Whether monstermos explosive depressurization is enabled.
/// Needs <see cref="MonstermosEqualization"/> to be enabled to work.
/// </summary>
public static readonly CVarDef < bool > MonstermosDepressurization =
2023-01-19 03:56:45 +01:00
CVarDef . Create ( "atmos.monstermos_depressurization" , true , CVar . SERVERONLY ) ;
2021-07-20 18:03:49 +02:00
2021-07-23 13:07:48 +02:00
/// <summary>
/// Whether monstermos explosive depressurization will rip tiles..
/// Needs <see cref="MonstermosEqualization"/> and <see cref="MonstermosDepressurization"/> to be enabled to work.
2023-12-11 13:45:26 -06:00
/// 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.
2021-07-23 13:07:48 +02:00
/// </summary>
public static readonly CVarDef < bool > MonstermosRipTiles =
2023-11-27 15:42:29 -06:00
CVarDef . Create ( "atmos.monstermos_rip_tiles" , false , CVar . SERVERONLY ) ;
2021-07-23 13:07:48 +02:00
2021-07-23 17:27:16 +02:00
/// <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 ) ;
2023-09-13 19:38:56 -08:00
/// <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.05f , 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 ) ;
2021-03-25 18:17:30 +01:00
/// <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 ) ;
2023-08-06 01:21:05 -07:00
/// <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 ) ;
2021-07-26 11:06:34 +02:00
/// <summary>
/// Whether excited groups will be processed and created.
/// </summary>
public static readonly CVarDef < bool > ExcitedGroups =
CVarDef . Create ( "atmos.excited_groups" , true , CVar . SERVERONLY ) ;
2021-07-23 13:07:48 +02:00
/// <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.
2021-07-26 11:06:34 +02:00
/// Needs <see cref="ExcitedGroups"/> to be enabled to work.
2021-07-23 13:07:48 +02:00
/// </summary>
public static readonly CVarDef < bool > ExcitedGroupsSpaceIsAllConsuming =
CVarDef . Create ( "atmos.excited_groups_space_is_all_consuming" , false , CVar . SERVERONLY ) ;
2020-11-27 16:49:12 +01:00
/// <summary>
/// Maximum time in milliseconds that atmos can take processing.
/// </summary>
public static readonly CVarDef < float > AtmosMaxProcessTime =
2022-02-15 12:04:34 +01:00
CVarDef . Create ( "atmos.max_process_time" , 3f , CVar . SERVERONLY ) ;
2020-11-27 16:49:12 +01:00
/// <summary>
/// Atmos tickrate in TPS. Atmos processing will happen every 1/TPS seconds.
/// </summary>
public static readonly CVarDef < float > AtmosTickRate =
2022-02-15 12:04:34 +01:00
CVarDef . Create ( "atmos.tickrate" , 15f , CVar . SERVERONLY ) ;
2020-11-27 16:49:12 +01:00
2023-12-11 15:59:47 -08:00
/// <summary>
/// Scale factor for how fast things happen in our atmosphere
2023-12-11 23:49:20 -08:00
/// simulation compared to real life. 1x means pumps run at 1x
/// speed. Players typically expect things to happen faster
/// in-game.
2023-12-11 15:59:47 -08:00
/// </summary>
public static readonly CVarDef < float > AtmosSpeedup =
2023-12-13 18:38:58 -08:00
CVarDef . Create ( "atmos.speedup" , 8f , CVar . SERVERONLY ) ;
2023-12-11 23:49:20 -08:00
/// <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 =
2023-12-13 18:38:58 -08:00
CVarDef . Create ( "atmos.heat_scale" , 8f , CVar . SERVERONLY ) ;
2023-12-11 15:59:47 -08:00
2020-11-27 17:12:45 +01:00
/ *
* 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 ) ;
2021-02-12 10:45:22 +01:00
/ *
* Holidays
* /
public static readonly CVarDef < bool > HolidaysEnabled = CVarDef . Create ( "holidays.enabled" , true , CVar . SERVERONLY ) ;
2020-11-27 16:24:19 +01:00
/ *
* Branding stuff
* /
public static readonly CVarDef < bool > BrandingSteam = CVarDef . Create ( "branding.steam" , false , CVar . CLIENTONLY ) ;
2021-02-16 20:14:32 +01:00
/ *
* OOC
* /
2022-03-16 22:58:35 +01:00
public static readonly CVarDef < bool > OocEnabled = CVarDef . Create ( "ooc.enabled" , true , CVar . NOTIFY | CVar . REPLICATED ) ;
2021-02-16 20:14:32 +01:00
public static readonly CVarDef < bool > AdminOocEnabled =
CVarDef . Create ( "ooc.enabled_admin" , true , CVar . NOTIFY ) ;
2021-02-25 19:42:16 -06:00
2022-05-19 22:18:28 -05:00
/// <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 ) ;
2022-06-20 16:59:04 -04:00
/// <summary>
/// Whether or not OOC chat should be enabled during a round.
/// </summary>
public static readonly CVarDef < bool > OocEnableDuringRound =
2023-05-06 08:06:42 +03:00
CVarDef . Create ( "ooc.enable_during_round" , false , CVar . NOTIFY | CVar . REPLICATED | CVar . SERVER ) ;
2022-06-20 16:59:04 -04:00
2021-02-25 19:42:16 -06:00
/ *
2022-01-11 16:29:55 +03:00
* LOOC
* /
2022-03-16 22:58:35 +01:00
public static readonly CVarDef < bool > LoocEnabled = CVarDef . Create ( "looc.enabled" , true , CVar . NOTIFY | CVar . REPLICATED ) ;
2022-01-11 16:29:55 +03:00
public static readonly CVarDef < bool > AdminLoocEnabled =
CVarDef . Create ( "looc.enabled_admin" , true , CVar . NOTIFY ) ;
2022-07-26 09:58:19 -04:00
/// <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 ) ;
2023-07-26 02:02:48 -04:00
/// <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 ) ;
2022-01-11 16:29:55 +03:00
/ *
2021-10-28 18:21:19 +13:00
* Entity Menu Grouping Types
2021-02-25 19:42:16 -06:00
* /
2021-10-28 18:21:19 +13:00
public static readonly CVarDef < int > EntityMenuGroupingType = CVarDef . Create ( "entity_menu" , 0 , CVar . CLIENTONLY ) ;
2021-02-28 22:11:45 +01:00
2022-01-04 06:37:06 -07:00
/ *
* 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 ) ;
2022-08-08 16:55:57 -07:00
/// <summary>
/// The loc string to display as a disconnect reason when someone is not whitelisted.
/// </summary>
public static readonly CVarDef < string > WhitelistReason =
CVarDef . Create ( "whitelist.reason" , "whitelist-not-whitelisted" , CVar . SERVERONLY ) ;
2023-01-30 23:57:45 -06:00
/// <summary>
/// If the playercount is below this number, the whitelist will not apply.
/// </summary>
public static readonly CVarDef < int > WhitelistMinPlayers =
CVarDef . Create ( "whitelist.min_players" , 0 , CVar . SERVERONLY ) ;
/// <summary>
/// If the playercount is above this number, the whitelist will not apply.
/// </summary>
public static readonly CVarDef < int > WhitelistMaxPlayers =
CVarDef . Create ( "whitelist.max_players" , int . MaxValue , CVar . SERVERONLY ) ;
2021-02-28 22:11:45 +01:00
/ *
* VOTE
* /
2021-11-23 17:03:04 +00:00
/// <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 =
2022-12-18 17:13:37 -08:00
CVarDef . Create ( "vote.restart_enabled" , true , CVar . SERVERONLY ) ;
2021-11-23 17:03:04 +00:00
2024-01-19 20:10:05 +13:00
/// <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" , 75 , CVar . SERVERONLY ) ;
2021-11-23 17:03:04 +00:00
/// <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 =
2022-03-17 13:59:53 -05:00
CVarDef . Create ( "vote.map_enabled" , false , CVar . SERVERONLY ) ;
2021-11-23 17:03:04 +00:00
2021-07-21 19:03:10 +02:00
/// <summary>
/// The required ratio of the server that must agree for a restart round vote to go through.
/// </summary>
2021-02-28 22:11:45 +01:00
public static readonly CVarDef < float > VoteRestartRequiredRatio =
2022-07-01 02:52:20 -05:00
CVarDef . Create ( "vote.restart_required_ratio" , 0.85f , CVar . SERVERONLY ) ;
2021-02-28 22:11:45 +01:00
2022-07-01 02:52:20 -05:00
/// <summary>
2023-12-24 23:55:56 -08:00
/// Whether or not to prevent the restart vote from having any effect when there is an online admin
2022-07-01 02:52:20 -05:00
/// </summary>
public static readonly CVarDef < bool > VoteRestartNotAllowedWhenAdminOnline =
CVarDef . Create ( "vote.restart_not_allowed_when_admin_online" , true , CVar . SERVERONLY ) ;
2022-07-04 15:14:04 +10:00
2021-07-21 19:03:10 +02:00
/// <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 ) ;
2022-02-06 21:26:19 -08:00
/// <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 >
2022-05-16 13:33:14 +10:00
VoteTimerRestart = CVarDef . Create ( "vote.timerrestart" , 60 , CVar . SERVERONLY ) ;
2022-02-06 21:26:19 -08:00
/// <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 ) ;
2021-04-09 19:28:03 +02:00
/ *
* BAN
* /
public static readonly CVarDef < bool > BanHardwareIds =
2021-11-04 00:28:01 +01:00
CVarDef . Create ( "ban.hardware_ids" , true , CVar . SERVERONLY ) ;
2023-03-10 16:41:22 +11:00
/ *
* 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 ) ;
2021-07-21 21:15:12 +10:00
/ *
* Shuttles
* /
2022-03-07 02:03:53 -03:00
2022-08-29 15:05:53 +10:00
// 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 =
2022-08-29 15:59:19 +10:00
CVarDef . Create ( "shuttle.camera_rotation_locked" , false , CVar . REPLICATED ) ;
2022-08-29 15:05:53 +10:00
2023-12-11 20:34:19 +11:00
/// <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 ) ;
2023-03-22 20:29:55 +11:00
/// <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>
2023-04-03 05:25:31 -07:00
public static readonly CVarDef < string > ArrivalsMap =
CVarDef . Create ( "shuttle.arrivals_map" , "/Maps/Misc/terminal.yml" , CVar . SERVERONLY ) ;
2023-03-22 20:29:55 +11:00
/// <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 =
2023-05-14 18:00:36 +10:00
CVarDef . Create ( "shuttle.arrivals_cooldown" , 50f , CVar . SERVERONLY ) ;
2023-03-22 20:29:55 +11:00
/// <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 ) ;
2023-04-25 11:48:29 +12:00
/// <summary>
/// Whether to automatically spawn escape shuttles.
/// </summary>
2023-05-31 11:13:02 +10:00
public static readonly CVarDef < bool > GridFill =
CVarDef . Create ( "shuttle.grid_fill" , true , CVar . SERVERONLY ) ;
2022-03-07 02:03:53 -03:00
2022-06-26 15:20:45 +10:00
/ *
* Emergency
* /
2022-08-01 18:26:25 +10:00
/// <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 ) ;
2022-06-26 15:20:45 +10:00
/// <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>
/// 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>
2023-03-31 15:20:43 +11:00
/// The minimum time for the emergency shuttle to arrive at centcomm.
/// </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.
2022-06-26 15:20:45 +10:00
/// </summary>
2023-03-31 15:20:43 +11:00
public static readonly CVarDef < float > EmergencyShuttleMaxTransitTime =
CVarDef . Create ( "shuttle.emergency_transit_time_max" , 180f , CVar . SERVERONLY ) ;
2022-06-26 15:20:45 +10:00
2022-06-27 15:19:40 +10:00
/// <summary>
/// Whether the emergency shuttle is enabled or should the round just end.
/// </summary>
public static readonly CVarDef < bool > EmergencyShuttleEnabled =
2023-03-31 15:20:43 +11:00
CVarDef . Create ( "shuttle.emergency" , true , CVar . SERVERONLY ) ;
2022-06-27 15:19:40 +10:00
2022-07-01 13:40:36 -07:00
/// <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 ) ;
2022-06-27 15:11:39 +02:00
/// <summary>
2022-11-09 20:20:36 -08:00
/// 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 ) ;
2022-08-08 22:10:01 -07:00
/ *
* 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 ) ;
2022-08-29 22:31:27 -04:00
/ *
* 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 ) ;
2023-01-17 19:38:12 -05:00
/ *
* 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 ) ;
2021-04-19 09:52:40 +02:00
/ *
* 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 =
2021-10-18 17:47:27 -05:00
CVarDef . Create ( "viewport.snap_tolerance_margin" , 64 , CVar . CLIENTONLY | CVar . ARCHIVE ) ;
2021-04-19 09:52:40 +02:00
public static readonly CVarDef < int > ViewportSnapToleranceClip =
2021-10-18 17:47:27 -05:00
CVarDef . Create ( "viewport.snap_tolerance_clip" , 32 , CVar . CLIENTONLY | CVar . ARCHIVE ) ;
2021-04-19 09:52:40 +02:00
public static readonly CVarDef < bool > ViewportScaleRender =
CVarDef . Create ( "viewport.scale_render" , true , CVar . CLIENTONLY | CVar . ARCHIVE ) ;
2021-07-17 14:34:18 +02:00
2022-10-17 15:13:41 -07:00
public static readonly CVarDef < int > ViewportMinimumWidth =
CVarDef . Create ( "viewport.minimum_width" , 15 , CVar . REPLICATED ) ;
public static readonly CVarDef < int > ViewportMaximumWidth =
CVarDef . Create ( "viewport.maximum_width" , 21 , CVar . REPLICATED ) ;
public static readonly CVarDef < int > ViewportWidth =
CVarDef . Create ( "viewport.width" , 21 , CVar . CLIENTONLY | CVar . ARCHIVE ) ;
/ *
* UI
* /
public static readonly CVarDef < string > UILayout =
CVarDef . Create ( "ui.layout" , "Default" , CVar . CLIENTONLY | CVar . ARCHIVE ) ;
2023-03-06 11:06:57 -08:00
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 ) ;
2022-10-17 15:13:41 -07:00
2024-01-03 04:07:02 -05:00
/ *
* Accessibility
* /
2024-04-01 13:48:02 -07:00
/// <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 ) ;
2024-01-03 04:07:02 -05:00
/// <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 ) ;
2024-02-11 07:38:55 +01:00
public static readonly CVarDef < bool > ChatEnableColorName =
CVarDef . Create ( "accessibility.enable_color_name" , true , CVar . CLIENTONLY | CVar . ARCHIVE , "Toggles displaying names with individual colors." ) ;
2024-02-02 13:39:12 +01:00
/// <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 ) ;
2024-03-09 06:43:19 -05:00
/// <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 ) ;
2021-07-17 14:34:18 +02:00
/ *
* CHAT
* /
2023-11-27 04:08:30 +01:00
/// <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 < int > ChatRateLimitPeriod =
CVarDef . Create ( "chat.rate_limit_period" , 2 , 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"/>
/// <seealso cref="ChatRateLimitAnnounceAdmins"/>
public static readonly CVarDef < int > ChatRateLimitCount =
CVarDef . Create ( "chat.rate_limit_count" , 10 , CVar . SERVERONLY ) ;
/// <summary>
/// If true, announce when a player breached chat rate limit to game administrators.
/// </summary>
/// <seealso cref="ChatRateLimitAnnounceAdminsDelay"/>
public static readonly CVarDef < bool > ChatRateLimitAnnounceAdmins =
CVarDef . Create ( "chat.rate_limit_announce_admins" , true , CVar . SERVERONLY ) ;
/// <summary>
/// Minimum delay (in seconds) between announcements from <see cref="ChatRateLimitAnnounceAdmins"/>.
/// </summary>
public static readonly CVarDef < int > ChatRateLimitAnnounceAdminsDelay =
CVarDef . Create ( "chat.rate_limit_announce_admins_delay" , 15 , CVar . SERVERONLY ) ;
2021-07-17 14:34:18 +02:00
public static readonly CVarDef < int > ChatMaxMessageLength =
CVarDef . Create ( "chat.max_message_length" , 1000 , CVar . SERVER | CVar . REPLICATED ) ;
2021-07-22 23:19:41 +02:00
2024-01-21 13:14:01 +04:00
public static readonly CVarDef < int > ChatMaxAnnouncementLength =
CVarDef . Create ( "chat.max_announcement_length" , 256 , CVar . SERVER | CVar . REPLICATED ) ;
2021-12-02 18:49:19 -06:00
public static readonly CVarDef < bool > ChatSanitizerEnabled =
CVarDef . Create ( "chat.chat_sanitizer_enabled" , true , CVar . SERVERONLY ) ;
2022-05-17 12:55:19 +03:00
public static readonly CVarDef < bool > ChatShowTypingIndicator =
CVarDef . Create ( "chat.show_typing_indicator" , true , CVar . CLIENTONLY ) ;
2023-12-04 18:10:49 -05:00
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." ) ;
2023-02-28 08:15:48 -08:00
/// <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." ) ;
2021-07-22 23:19:41 +02:00
/ *
* 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 ) ;
2021-10-21 05:52:26 -05:00
/ *
* 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 ) ;
2021-12-23 04:14:01 -08:00
2022-05-14 08:58:45 +10:00
/// <summary>
/// Allows flavor text (character descriptions)
/// </summary>
public static readonly CVarDef < bool > FlavorText =
CVarDef . Create ( "ic.flavor_text" , false , CVar . SERVER | CVar . REPLICATED ) ;
2022-08-31 13:42:46 +01:00
/// <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 ) ;
2022-09-14 05:50:15 -04:00
/// <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 ) ;
2023-03-28 21:30:00 -04:00
/// <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 ) ;
2023-09-11 08:52:56 +03:00
/// <summary>
/// Control displaying SSD indicators near players
/// </summary>
public static readonly CVarDef < bool > ICShowSSDIndicator =
CVarDef . Create ( "ic.show_ssd_indicator" , true , CVar . CLIENTONLY ) ;
2021-12-23 04:14:01 -08:00
/ *
* Salvage
* /
2023-04-21 15:05:50 +10:00
/// <summary>
2023-09-19 22:52:01 +10:00
/// Duration for missions
2023-04-21 15:05:50 +10:00
/// </summary>
public static readonly CVarDef < float >
2023-11-14 09:39:33 +11:00
SalvageExpeditionDuration = CVarDef . Create ( "salvage.expedition_duration" , 660f , CVar . REPLICATED ) ;
Flavor profiles (#10991)
* flavor profiles
TODO: every single flavor! yeah!!!
* adds basic localization, and flavors/lastFlavor values for when you get the flavor profile message
* multiple and single flavor messages
* start on flavor localization, multiple flavors in localized flavors
* flavor prototypes
* a few more flavors, descriptions on what each section of the flavor file should be doing
* localization for flavor profiles in drink/food system
* adds an event that allows a flavor profile list to be transformed base on the user entity
* raises it on the food entity too
* changes a field in flavor, adds some more flavors, starts adding flavor prototypes
* adds basic flavors to several entities, and consumable drinks, renames flavor field to 'flavors'
* changes call ordering in flavorprofile, adds flavor to ignored components server-side
flavor is really just a popup message, and those are all processed server-side
* fixes where food tried to get the flavor of the user instead of the food
* single flavors will now get the localized string
* getting the flavor message now ensures that flavors are deduplicated
* makes flavor processing more strictly unique bu making everything hashsets
* yeah, that could just not have distinctby now
* adds flavorprofile directly to food base instead for generic food taste
* FlavorProfileModificationEvent now passes a hashset of strings and not flavorprototypes
* flavorprofilesystem now broadcasts the flavor profile modification event
* adds more flavors to the flavor profile loc file
* skips a flavor, if the flavor string is null/empty
* adds some more flavors, adds generic medicine flavor to medicinal chemicals
* more food flavors, adds flavors to swallowing
* adds some cocktails to the set of flavor profiles
* regenerates flavor prototypes
* adds flavor type to all flavors, adds whitespace between variants
* adds more flavors, adds flavors to several chemicals and food items
this is the part that took the longest
* changes backup flavor message
* spelling mistake
* more flavors, and flavors on food
* readds all the type fields, whoops
* fixes localization strings for forcefeeding food/drink
* fixes multiple flavor profile
* adds flavor limit for flavors
* makes that fetch the cvardef instead
2022-09-08 16:14:49 -07:00
2023-09-19 22:52:01 +10:00
/// <summary>
/// Cooldown for missions.
/// </summary>
2023-04-21 15:05:50 +10:00
public static readonly CVarDef < float >
2023-09-19 22:52:01 +10:00
SalvageExpeditionCooldown = CVarDef . Create ( "salvage.expedition_cooldown" , 780f , CVar . REPLICATED ) ;
2023-04-21 15:05:50 +10:00
/ *
Flavor profiles (#10991)
* flavor profiles
TODO: every single flavor! yeah!!!
* adds basic localization, and flavors/lastFlavor values for when you get the flavor profile message
* multiple and single flavor messages
* start on flavor localization, multiple flavors in localized flavors
* flavor prototypes
* a few more flavors, descriptions on what each section of the flavor file should be doing
* localization for flavor profiles in drink/food system
* adds an event that allows a flavor profile list to be transformed base on the user entity
* raises it on the food entity too
* changes a field in flavor, adds some more flavors, starts adding flavor prototypes
* adds basic flavors to several entities, and consumable drinks, renames flavor field to 'flavors'
* changes call ordering in flavorprofile, adds flavor to ignored components server-side
flavor is really just a popup message, and those are all processed server-side
* fixes where food tried to get the flavor of the user instead of the food
* single flavors will now get the localized string
* getting the flavor message now ensures that flavors are deduplicated
* makes flavor processing more strictly unique bu making everything hashsets
* yeah, that could just not have distinctby now
* adds flavorprofile directly to food base instead for generic food taste
* FlavorProfileModificationEvent now passes a hashset of strings and not flavorprototypes
* flavorprofilesystem now broadcasts the flavor profile modification event
* adds more flavors to the flavor profile loc file
* skips a flavor, if the flavor string is null/empty
* adds some more flavors, adds generic medicine flavor to medicinal chemicals
* more food flavors, adds flavors to swallowing
* adds some cocktails to the set of flavor profiles
* regenerates flavor prototypes
* adds flavor type to all flavors, adds whitespace between variants
* adds more flavors, adds flavors to several chemicals and food items
this is the part that took the longest
* changes backup flavor message
* spelling mistake
* more flavors, and flavors on food
* readds all the type fields, whoops
* fixes localization strings for forcefeeding food/drink
* fixes multiple flavor profile
* adds flavor limit for flavors
* makes that fetch the cvardef instead
2022-09-08 16:14:49 -07:00
* 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 ) ;
2022-09-03 06:39:28 -07:00
/ *
* 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 ) ;
Flavor profiles (#10991)
* flavor profiles
TODO: every single flavor! yeah!!!
* adds basic localization, and flavors/lastFlavor values for when you get the flavor profile message
* multiple and single flavor messages
* start on flavor localization, multiple flavors in localized flavors
* flavor prototypes
* a few more flavors, descriptions on what each section of the flavor file should be doing
* localization for flavor profiles in drink/food system
* adds an event that allows a flavor profile list to be transformed base on the user entity
* raises it on the food entity too
* changes a field in flavor, adds some more flavors, starts adding flavor prototypes
* adds basic flavors to several entities, and consumable drinks, renames flavor field to 'flavors'
* changes call ordering in flavorprofile, adds flavor to ignored components server-side
flavor is really just a popup message, and those are all processed server-side
* fixes where food tried to get the flavor of the user instead of the food
* single flavors will now get the localized string
* getting the flavor message now ensures that flavors are deduplicated
* makes flavor processing more strictly unique bu making everything hashsets
* yeah, that could just not have distinctby now
* adds flavorprofile directly to food base instead for generic food taste
* FlavorProfileModificationEvent now passes a hashset of strings and not flavorprototypes
* flavorprofilesystem now broadcasts the flavor profile modification event
* adds more flavors to the flavor profile loc file
* skips a flavor, if the flavor string is null/empty
* adds some more flavors, adds generic medicine flavor to medicinal chemicals
* more food flavors, adds flavors to swallowing
* adds some cocktails to the set of flavor profiles
* regenerates flavor prototypes
* adds flavor type to all flavors, adds whitespace between variants
* adds more flavors, adds flavors to several chemicals and food items
this is the part that took the longest
* changes backup flavor message
* spelling mistake
* more flavors, and flavors on food
* readds all the type fields, whoops
* fixes localization strings for forcefeeding food/drink
* fixes multiple flavor profile
* adds flavor limit for flavors
* makes that fetch the cvardef instead
2022-09-08 16:14:49 -07:00
2021-12-24 17:32:33 -08:00
/ *
* 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 ) ;
2022-01-18 16:44:22 -05:00
2022-05-27 23:50:11 +02:00
/// <summary>
/// Don't show rules to localhost/loopback interface.
/// </summary>
public static readonly CVarDef < bool > RulesExemptLocal =
CVarDef . Create ( "rules.exempt_local" , true , CVar . SERVERONLY ) ;
2022-01-18 16:44:22 -05:00
/ *
* Autogeneration
* /
public static readonly CVarDef < string > DestinationFile =
CVarDef . Create ( "autogen.destination_file" , "" , CVar . SERVER | CVar . SERVERONLY ) ;
2022-03-26 12:46:37 +01:00
/ *
* 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 ) ;
2022-04-09 09:17:52 +12:00
/ *
* 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 ) ;
2022-05-30 10:09:50 +02:00
2023-10-18 22:59:00 +02:00
/// <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 ) ;
2023-12-05 18:38:10 -05:00
/ *
* STORAGE
* /
2023-12-04 18:04:39 -05:00
/// <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 ) ;
2023-12-05 18:38:10 -05:00
/// <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 ) ;
2022-05-30 10:09:50 +02:00
/ *
* 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 ) ;
2022-06-16 17:56:09 +08:00
/ *
* Ghost
* /
/// <summary>
/// The time you must spend reading the rules, before the "Request" button is enabled
/// </summary>
public static readonly CVarDef < float > GhostRoleTime =
2024-02-16 00:30:55 +01:00
CVarDef . Create ( "ghost.role_time" , 3f , CVar . REPLICATED | CVar . SERVER ) ;
2022-08-07 08:00:42 +02:00
2022-09-05 18:15:50 -07:00
/ *
* 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 ) ;
2022-08-07 08:00:42 +02:00
/ *
* PLAYTIME
* /
/// <summary>
/// Time between play time autosaves, in seconds.
/// </summary>
public static readonly CVarDef < float >
PlayTimeSaveInterval = CVarDef . Create ( "playtime.save_interval" , 900f , CVar . SERVERONLY ) ;
2022-12-03 02:23:43 +01:00
/ *
* 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 ) ;
2022-12-16 23:26:24 +01:00
2023-03-19 01:55:12 +01:00
/// <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 ) ;
2022-12-16 23:26:24 +01:00
/ *
* 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 ) ;
2023-05-16 06:36:45 -05:00
/ *
* 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 ) ;
2023-06-05 16:33:49 +12:00
/ *
* 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 =
2023-06-19 05:23:31 +12:00
CVarDef . Create ( "replay.record_admin_chat" , false , CVar . ARCHIVE ) ;
2023-07-23 16:02:23 +02:00
/// <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.
2023-09-16 23:46:12 +12:00
/// Unless this path is rooted, it will be relative to <see cref="CVars.ReplayDirectory"/>.
2023-07-23 16:02:23 +02:00
/// </summary>
public static readonly CVarDef < string > ReplayAutoRecordTempDir =
CVarDef . Create ( "replay.auto_record_temp_dir" , "" , CVar . SERVERONLY ) ;
2023-11-22 15:36:38 +11:00
/ *
* Miscellaneous
* /
public static readonly CVarDef < bool > GatewayGeneratorEnabled =
CVarDef . Create ( "gateway.generator_enabled" , true ) ;
2024-02-17 21:52:11 +01:00
/ *
* 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 ) ;
2020-09-25 21:21:22 +02:00
}
}