Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: Setting to automatically restart server based on hours played #11142

Merged
merged 1 commit into from
Jan 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
80 changes: 56 additions & 24 deletions src/network/network_server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
#include "../timer/timer.h"
#include "../timer/timer_game_calendar.h"
#include "../timer/timer_game_economy.h"
#include "../timer/timer_game_realtime.h"
#include <mutex>
#include <condition_variable>

Expand Down Expand Up @@ -1491,29 +1492,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 @@ -1811,11 +1789,65 @@ void NetworkServer_Tick(bool send_frame)
}
}

/** Helper function to restart the map. */
static void NetworkRestartMap()
{
_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;
}
}

/** 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::hours::zero(), TimerGameRealtime::UNPAUSED}, [](auto)
{
if (!_network_server) return;

/* If setting is 0, this feature is disabled. */
if (_settings_client.network.restart_hours == 0) return;
2TallTyler marked this conversation as resolved.
Show resolved Hide resolved

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

/**
* Reset the automatic network restart time interval.
* @param reset Whether to reset the timer to zero.
*/
void ChangeNetworkRestartTime(bool reset)
{
if (!_network_server) return;

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

/** 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);
NetworkRestartMap();
}
}
2TallTyler marked this conversation as resolved.
Show resolved Hide resolved

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

NetworkCheckRestartMap();
NetworkCheckRestartMapYear();
});

/** Economy yearly "callback". Called whenever the economy year changes. */
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(bool reset);
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 @@ -917,7 +918,11 @@ static void MakeNewGameDone()
CheckIndustries();
MarkWholeScreenDirty();

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

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 @@ -325,6 +325,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(bool reset);

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

Expand Down Expand Up @@ -241,6 +242,16 @@ min = CalendarTime::MIN_YEAR
max = CalendarTime::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(false); }

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