Skip to content

Commit

Permalink
Feature: Setting to automatically restart dedicated server based on h…
Browse files Browse the repository at this point in the history
…ours played
  • Loading branch information
2TallTyler committed Jul 27, 2023
1 parent 6e99326 commit ec66197
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 25 deletions.
77 changes: 53 additions & 24 deletions src/network/network_server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#include "../rev.h"
#include "../timer/timer.h"
#include "../timer/timer_game_calendar.h"
#include "../timer/timer_game_realtime.h"
#include <mutex>
#include <condition_variable>

Expand Down Expand Up @@ -1490,29 +1491,6 @@ void NetworkUpdateClientInfo(ClientID client_id)
NetworkAdminClientUpdate(ci);
}

/** Check if we want to restart the map */
static void NetworkCheckRestartMap()
{
if (_settings_client.network.restart_game_year != 0 && TimerGameCalendar::year >= _settings_client.network.restart_game_year) {
Debug(net, 3, "Auto-restarting map: year {} reached", TimerGameCalendar::year);

_settings_newgame.game_creation.generation_seed = GENERATE_NEW_SEED;
switch(_file_to_saveload.abstract_ftype) {
case FT_SAVEGAME:
case FT_SCENARIO:
_switch_mode = SM_LOAD_GAME;
break;

case FT_HEIGHTMAP:
_switch_mode = SM_START_HEIGHTMAP;
break;

default:
_switch_mode = SM_NEWGAME;
}
}
}

/** Check if the server has autoclean_companies activated
* Two things happen:
* 1) If a company is not protected, it is closed after 1 year (for example)
Expand Down Expand Up @@ -1813,12 +1791,63 @@ void NetworkServer_Tick(bool send_frame)
}
}

/** Helper function to restart the map. */
static void RestartMapHelper()
{
_settings_newgame.game_creation.generation_seed = GENERATE_NEW_SEED;
switch (_file_to_saveload.abstract_ftype) {
case FT_SAVEGAME:
case FT_SCENARIO:
_switch_mode = SM_LOAD_GAME;
break;

case FT_HEIGHTMAP:
_switch_mode = SM_START_HEIGHTMAP;
break;

default:
_switch_mode = SM_NEWGAME;
}
}

/** Check if we want to restart the map based on the year. */
static void NetworkCheckRestartMapYear()
{
/* If setting is 0, this feature is disabled. */
if (_settings_client.network.restart_game_year == 0) return;

if (TimerGameCalendar::year >= _settings_client.network.restart_game_year) {
Debug(net, 3, "Auto-restarting map: year {} reached", TimerGameCalendar::year);
RestartMapHelper();
}
}

/** Timer to restart a network server automatically based on real-time hours played. Initialized at zero to disable until settings are loaded. */
static IntervalTimer<TimerGameRealtime> _network_restart_map_timer({std::chrono::milliseconds::zero(), TimerGameRealtime::UNPAUSED}, [](auto)
{
if (!_network_server) return;

/* If setting is 0, this feature is disabled. */
if (_settings_client.network.restart_hours == 0) return;

Debug(net, 3, "Auto-restarting map: {} hours played", _settings_client.network.restart_hours);
RestartMapHelper();
});

/** Reset the automatic network restart time interval. */
void ChangeNetworkRestartTime()
{
if (!_network_server) return;

_network_restart_map_timer.SetInterval({ std::chrono::hours(_settings_client.network.restart_hours), TimerGameRealtime::UNPAUSED }, true);
}

/** Yearly "callback". Called whenever the year changes. */
static IntervalTimer<TimerGameCalendar> _network_yearly({TimerGameCalendar::YEAR, TimerGameCalendar::Priority::NONE}, [](auto)
{
if (!_network_server) return;

NetworkCheckRestartMap();
NetworkCheckRestartMapYear();
NetworkAdminUpdate(ADMIN_FREQUENCY_ANUALLY);
});

Expand Down
1 change: 1 addition & 0 deletions src/network/network_server.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ class ServerNetworkGameSocketHandler : public NetworkClientSocketPool::PoolItem<
};

void NetworkServer_Tick(bool send_frame);
void ChangeNetworkRestartTime();
void NetworkServerSetCompanyPassword(CompanyID company_id, const std::string &password, bool already_hashed = true);
void NetworkServerUpdateCompanyPassworded(CompanyID company_id, bool passworded);

Expand Down
7 changes: 6 additions & 1 deletion src/openttd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include "console_func.h"
#include "screenshot.h"
#include "network/network.h"
#include "network/network_server.h"
#include "network/network_func.h"
#include "ai/ai.hpp"
#include "ai/ai_config.hpp"
Expand Down Expand Up @@ -890,7 +891,11 @@ static void MakeNewGameDone()
CheckIndustries();
MarkWholeScreenDirty();

if (_network_server && !_network_dedicated) ShowClientList();
if (_network_server) {
ChangeNetworkRestartTime();

if (!_network_dedicated) ShowClientList();
}
}

static void MakeNewGame(bool from_heightmap, bool reset_settings)
Expand Down
1 change: 1 addition & 0 deletions src/settings_type.h
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,7 @@ struct NetworkSettings {
uint8_t max_companies; ///< maximum amount of companies
uint8_t max_clients; ///< maximum amount of clients
TimerGameCalendar::Year restart_game_year; ///< year the server restarts
uint16_t restart_hours; ///< number of hours to run the server before automatic restart
uint8_t min_active_clients; ///< minimum amount of active clients to unpause the game
bool reload_cfg; ///< reload the config file before restarting
std::string last_joined; ///< Last joined server
Expand Down
11 changes: 11 additions & 0 deletions src/table/settings/network_settings.ini
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

[pre-amble]
static void UpdateClientConfigValues();
void ChangeNetworkRestartTime();

static constexpr std::initializer_list<const char*> _server_game_type{"local", "public", "invite-only"};

Expand Down Expand Up @@ -241,6 +242,16 @@ min = MIN_YEAR
max = MAX_YEAR
interval = 1

[SDTC_VAR]
var = network.restart_hours
type = SLE_UINT16
flags = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_GUI_0_IS_SPECIAL | SF_NETWORK_ONLY
def = 0
min = 0
max = UINT16_MAX
interval = 1
post_cb = [](auto) {ChangeNetworkRestartTime(); }

[SDTC_VAR]
var = network.min_active_clients
type = SLE_UINT8
Expand Down

0 comments on commit ec66197

Please sign in to comment.