Files
Nitrox/NitroxModel/Serialization/SubnauticaServerConfig.cs
2025-07-06 00:23:46 +02:00

131 lines
5.0 KiB
C#

using NitroxModel.DataStructures.GameLogic;
using NitroxModel.Helper;
using NitroxModel.Server;
namespace NitroxModel.Serialization
{
[PropertyDescription("Server settings can be changed here")]
public class SubnauticaServerConfig : NitroxConfig<SubnauticaServerConfig>
{
private int maxConnectionsSetting = 100;
private int initialSyncTimeoutSetting = 300000;
[PropertyDescription("Set to true to Cache entities for the whole map on next run. \nWARNING! Will make server load take longer on the cache run but players will gain a performance boost when entering new areas.")]
public bool CreateFullEntityCache { get; set; } = false;
private int saveIntervalSetting = 120000;
private int maxBackupsSetting = 10;
private string postSaveCommandPath = string.Empty;
public override string FileName => "server.cfg";
[PropertyDescription("Leave blank for a random spawn position")]
public string Seed { get; set; }
public int ServerPort { get; set; } = ServerList.DEFAULT_PORT;
[PropertyDescription("Prevents players from losing items on death")]
public bool KeepInventoryOnDeath { get; set; } = false;
[PropertyDescription("Measured in milliseconds")]
public int SaveInterval
{
get => saveIntervalSetting;
set
{
Validate.IsTrue(value >= 1000, "SaveInterval must be greater than 1000");
saveIntervalSetting = value;
}
}
public int MaxBackups
{
get => maxBackupsSetting;
set
{
Validate.IsTrue(value >= 0, "MaxBackups must be greater than or equal to 0");
maxBackupsSetting = value;
}
}
[PropertyDescription("Command to run following a successful world save (e.g. .exe, .bat, or PowerShell script). ")]
public string PostSaveCommandPath
{
get => postSaveCommandPath;
set => postSaveCommandPath = value?.Trim('"').Trim();
}
public int MaxConnections
{
get => maxConnectionsSetting;
set
{
Validate.IsTrue(value > 0, "MaxConnections must be greater than 0");
maxConnectionsSetting = value;
}
}
public int InitialSyncTimeout
{
get => initialSyncTimeoutSetting;
set
{
Validate.IsTrue(value > 30000, "InitialSyncTimeout must be greater than 30 seconds");
initialSyncTimeoutSetting = value;
}
}
public bool DisableConsole { get; set; }
public bool DisableAutoSave { get; set; }
public bool DisableAutoBackup { get; set; }
public string ServerPassword { get; set; } = string.Empty;
public string AdminPassword { get; set; } = StringHelper.GenerateRandomString(12);
[PropertyDescription("Possible values:", typeof(NitroxGameMode))]
public NitroxGameMode GameMode { get; set; } = NitroxGameMode.SURVIVAL;
[PropertyDescription("Possible values:", typeof(ServerSerializerMode))]
public ServerSerializerMode SerializerMode { get; set; } = ServerSerializerMode.JSON;
[PropertyDescription("Possible values:", typeof(Perms))]
public Perms DefaultPlayerPerm { get; set; } = Perms.PLAYER;
[PropertyDescription("\nDefault player stats below here")]
public float DefaultOxygenValue { get; set; } = 45;
public float DefaultMaxOxygenValue { get; set; } = 45;
public float DefaultHealthValue { get; set; } = 80;
public float DefaultHungerValue { get; set; } = 50.5f;
public float DefaultThirstValue { get; set; } = 90.5f;
[PropertyDescription("Recommended to keep at 0.1f which is the default starting value. If set to 0 then new players are cured by default.")]
public float DefaultInfectionValue { get; set; } = 0.1f;
public PlayerStatsData DefaultPlayerStats => new(DefaultOxygenValue, DefaultMaxOxygenValue, DefaultHealthValue, DefaultHungerValue, DefaultThirstValue, DefaultInfectionValue);
[PropertyDescription("If set to true, the server will try to open port on your router via UPnP")]
public bool AutoPortForward { get; set; } = true;
[PropertyDescription("Determines whether the server will listen for and reply to LAN discovery requests.")]
public bool LANDiscoveryEnabled { get; set; } = true;
[PropertyDescription("When true, will reject any build actions detected as desynced")]
public bool SafeBuilding { get; set; } = true;
[PropertyDescription("When true and started in launcher, will use launcher UI as opposed to external window")]
public bool IsEmbedded { get; set; } = true;
[PropertyDescription("Activates/Deactivates Player versus Player damage/interactions")]
public bool PvPEnabled { get; set; } = true;
}
}