diff --git a/CMakeLists.txt b/CMakeLists.txt index e53fab1..2f4e273 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -195,6 +195,7 @@ target_compile_definitions(${PROJECT_NAME} PRIVATE ${PRJ_DEFINITIONS} ${PRJ_WARN ) if(MSVC) + target_compile_options(${PROJECT_NAME} PUBLIC "/bigobj") target_link_options(${PROJECT_NAME} PRIVATE "/SUBSYSTEM:CONSOLE") endif(MSVC) diff --git a/include/Env.h b/include/Env.h index dc56353..749cb3e 100644 --- a/include/Env.h +++ b/include/Env.h @@ -26,6 +26,7 @@ enum class Key { // provider settings PROVIDER_UPDATE_MESSAGE, PROVIDER_DISABLE_CONFIG, + PROVIDER_PORT_ENV, }; std::optional Get(Key key); diff --git a/include/TConfig.h b/include/TConfig.h index c0b9902..0701076 100644 --- a/include/TConfig.h +++ b/include/TConfig.h @@ -35,11 +35,11 @@ public: [[nodiscard]] bool Failed() const { return mFailed; } void FlushToFile(); + void PrintDebug(); private: void CreateConfigFile(); void ParseFromFile(std::string_view name); - void PrintDebug(); void TryReadValue(toml::value& Table, const std::string& Category, const std::string_view& Key, const std::string_view& Env, std::string& OutValue); void TryReadValue(toml::value& Table, const std::string& Category, const std::string_view& Key, const std::string_view& Env, bool& OutValue); void TryReadValue(toml::value& Table, const std::string& Category, const std::string_view& Key, const std::string_view& Env, int& OutValue); diff --git a/src/Env.cpp b/src/Env.cpp index 82037a0..a969de3 100644 --- a/src/Env.cpp +++ b/src/Env.cpp @@ -36,6 +36,9 @@ std::string_view Env::ToString(Env::Key key) { case Key::PROVIDER_DISABLE_CONFIG: return "BEAMMP_PROVIDER_DISABLE_CONFIG"; break; + case Key::PROVIDER_PORT_ENV: + return "BEAMMP_PROVIDER_PORT_ENV"; + break; } return ""; } diff --git a/src/TConfig.cpp b/src/TConfig.cpp index 543ada3..7192f87 100644 --- a/src/TConfig.cpp +++ b/src/TConfig.cpp @@ -234,7 +234,11 @@ void TConfig::ParseFromFile(std::string_view name) { // GENERAL TryReadValue(data, "General", StrDebug, EnvStrDebug, Application::Settings.DebugModeEnabled); TryReadValue(data, "General", StrPrivate, EnvStrPrivate, Application::Settings.Private); - TryReadValue(data, "General", StrPort, EnvStrPort, Application::Settings.Port); + if (Env::Get(Env::Key::PROVIDER_PORT_ENV).has_value()) { + TryReadValue(data, "General", StrPort, Env::Get(Env::Key::PROVIDER_PORT_ENV).value(), Application::Settings.Port); + } else { + TryReadValue(data, "General", StrPort, EnvStrPort, Application::Settings.Port); + } TryReadValue(data, "General", StrMaxCars, EnvStrMaxCars, Application::Settings.MaxCars); TryReadValue(data, "General", StrMaxPlayers, EnvStrMaxPlayers, Application::Settings.MaxPlayers); TryReadValue(data, "General", StrMap, EnvStrMap, Application::Settings.MapName); @@ -255,7 +259,6 @@ void TConfig::ParseFromFile(std::string_view name) { Application::SetSubsystemStatus("Config", Application::Status::Bad); return; } - PrintDebug(); // Update in any case if (!mDisableConfig) { diff --git a/src/main.cpp b/src/main.cpp index 311fa26..309eef7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -30,6 +30,7 @@ #include "TResourceManager.h" #include "TServer.h" +#include #include #include @@ -40,6 +41,9 @@ USAGE: ARGUMENTS: --help Displays this help and exits. + --port=1234 + Sets the server's listening TCP and + UDP port. Overrides ENV and ServerConfig. --config=/path/to/ServerConfig.toml Absolute or relative path to the Server Config file, including the @@ -91,6 +95,7 @@ int BeamMPServerMain(MainArguments Arguments) { Parser.RegisterArgument({ "help" }, ArgsParser::NONE); Parser.RegisterArgument({ "version" }, ArgsParser::NONE); Parser.RegisterArgument({ "config" }, ArgsParser::HAS_VALUE); + Parser.RegisterArgument({ "port" }, ArgsParser::HAS_VALUE); Parser.RegisterArgument({ "working-directory" }, ArgsParser::HAS_VALUE); Parser.Parse(Arguments.List); if (!Parser.Verify()) { @@ -124,7 +129,7 @@ int BeamMPServerMain(MainArguments Arguments) { } } } - + TConfig Config(ConfigPath); if (Config.Failed()) { @@ -135,6 +140,24 @@ int BeamMPServerMain(MainArguments Arguments) { } return 1; } + + // override port if provided via arguments + if (Parser.FoundArgument({ "port" })) { + auto Port = Parser.GetValueOfArgument({ "port" }); + if (Port.has_value()) { + auto P = int(std::strtoul(Port.value().c_str(), nullptr, 10)); + if (P == 0 || P < 0 || P > UINT16_MAX) { + beammp_errorf("Custom port requested via --port is invalid: '{}'", Port.value()); + return 1; + } else { + Application::Settings.Port = P; + beammp_info("Custom port requested via commandline arguments: " + Port.value()); + } + } + } + + Config.PrintDebug(); + Application::InitializeConsole(); Application::Console().StartLoggingToFile();