Changeset - r28569:181c923a13a0
[Not reviewed]
master
0 5 0
Tyler Trahan - 10 months ago 2024-01-26 15:25:25
tyler@tylertrahan.com
Feature: Setting to automatically restart server based on hours played (#11142)
5 files changed with 75 insertions and 25 deletions:
0 comments (0 inline, 0 general)
src/network/network_server.cpp
Show inline comments
 
@@ -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>
 

	
 
@@ -1491,29 +1492,6 @@ void NetworkUpdateClientInfo(ClientID cl
 
	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)
 
@@ -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;
 

	
 
	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();
 
	}
 
}
 

	
 
/** 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. */
src/network/network_server.h
Show inline comments
 
@@ -120,6 +120,7 @@ public:
 
};
 

	
 
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);
 

	
src/openttd.cpp
Show inline comments
 
@@ -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"
 
@@ -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)
src/settings_type.h
Show inline comments
 
@@ -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
src/table/settings/network_settings.ini
Show inline comments
 
@@ -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"};
 

	
 
@@ -242,6 +243,16 @@ 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
 
flags    = SF_NOT_IN_SAVE | SF_NO_NETWORK_SYNC | SF_NETWORK_ONLY
0 comments (0 inline, 0 general)