mirror of https://github.com/OpenTTD/OpenTTD.git
(svn r6628) - Feature: Add the ability to pause a server if not enough players are connected. The setting for this is 'min_players' and can be set in the config and via the console. If the number of players drops below this number, the server will pause the game.
This commit is contained in:
parent
950ef8f237
commit
53744881a4
|
@ -612,6 +612,12 @@ DEF_CONSOLE_HOOK(ConHookValidateMaxSpectatorsCount)
|
|||
return true;
|
||||
}
|
||||
|
||||
DEF_CONSOLE_HOOK(ConHookCheckMinPlayers)
|
||||
{
|
||||
CheckMinPlayers();
|
||||
return true;
|
||||
}
|
||||
|
||||
DEF_CONSOLE_CMD(ConKick)
|
||||
{
|
||||
NetworkClientInfo *ci;
|
||||
|
@ -1580,6 +1586,10 @@ void IConsoleStdLibRegister(void)
|
|||
IConsoleVarRegister("restart_game_year", &_network_restart_game_year, ICONSOLE_VAR_UINT16, "Auto-restart the server when Jan 1st of the set year is reached. Use '0' to disable this");
|
||||
IConsoleVarHookAdd("restart_game_year", ICONSOLE_HOOK_ACCESS, ConHookServerOnly);
|
||||
|
||||
IConsoleVarRegister("min_players", &_network_min_players, ICONSOLE_VAR_BYTE, "Automatically pause the game when the number of active players passes below the given amount");
|
||||
IConsoleVarHookAdd("min_players", ICONSOLE_HOOK_ACCESS, ConHookServerOnly);
|
||||
IConsoleVarHookAdd("min_players", ICONSOLE_HOOK_POST_ACTION, ConHookCheckMinPlayers);
|
||||
|
||||
#endif /* ENABLE_NETWORK */
|
||||
|
||||
// debugging stuff
|
||||
|
|
41
network.c
41
network.c
|
@ -286,6 +286,42 @@ char *GetNetworkErrorMsg(char *buf, NetworkErrorCode err)
|
|||
return GetString(buf, network_error_strings[err]);
|
||||
}
|
||||
|
||||
/* Count the number of active clients connected */
|
||||
static uint NetworkCountPlayers(void)
|
||||
{
|
||||
NetworkClientState *cs;
|
||||
uint count = 0;
|
||||
|
||||
FOR_ALL_CLIENTS(cs) {
|
||||
NetworkClientInfo *ci = DEREF_CLIENT_INFO(cs);
|
||||
if (ci->client_playas > 0 && ci->client_playas <= MAX_PLAYERS) count++;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static bool _min_players_paused = false;
|
||||
|
||||
/* Check if the minimum number of players has been reached and pause or unpause the game as appropriate */
|
||||
void CheckMinPlayers(void)
|
||||
{
|
||||
if (!_network_dedicated) return;
|
||||
|
||||
if (NetworkCountPlayers() < _network_min_players) {
|
||||
if (_min_players_paused) return;
|
||||
|
||||
_min_players_paused = true;
|
||||
DoCommandP(0, 1, 0, NULL, CMD_PAUSE);
|
||||
NetworkServer_HandleChat(NETWORK_ACTION_CHAT, DESTTYPE_BROADCAST, 0, "Game paused (not enough players)", NETWORK_SERVER_INDEX);
|
||||
} else {
|
||||
if (!_min_players_paused) return;
|
||||
|
||||
_min_players_paused = false;
|
||||
DoCommandP(0, 0, 0, NULL, CMD_PAUSE);
|
||||
NetworkServer_HandleChat(NETWORK_ACTION_CHAT, DESTTYPE_BROADCAST, 0, "Game unpaused (enough players)", NETWORK_SERVER_INDEX);
|
||||
}
|
||||
}
|
||||
|
||||
// Find all IP-aliases for this host
|
||||
static void NetworkFindIPs(void)
|
||||
{
|
||||
|
@ -626,6 +662,8 @@ void NetworkCloseClient(NetworkClientState *cs)
|
|||
cs->status = STATUS_INACTIVE;
|
||||
cs->index = NETWORK_EMPTY_INDEX;
|
||||
ci->client_index = NETWORK_EMPTY_INDEX;
|
||||
|
||||
CheckMinPlayers();
|
||||
}
|
||||
|
||||
// A client wants to connect to a server
|
||||
|
@ -1041,6 +1079,9 @@ bool NetworkServerStart(void)
|
|||
// if the server is dedicated ... add some other script
|
||||
if (_network_dedicated) IConsoleCmdExec("exec scripts/on_dedicated.scr 0");
|
||||
|
||||
_min_players_paused = false;
|
||||
CheckMinPlayers();
|
||||
|
||||
/* Try to register us to the master server */
|
||||
_network_last_advertise_frame = 0;
|
||||
_network_need_advertise = true;
|
||||
|
|
|
@ -207,6 +207,7 @@ VARDEF uint8 _network_autoclean_unprotected; // Remove a company after X months
|
|||
VARDEF uint8 _network_autoclean_protected; // Unprotect a company after X months
|
||||
|
||||
VARDEF Year _network_restart_game_year; // If this year is reached, the server automaticly restarts
|
||||
VARDEF uint8 _network_min_players; // Minimum number of players for game to unpause
|
||||
|
||||
NetworkGameList *NetworkQueryServer(const char* host, unsigned short port, bool game_info);
|
||||
|
||||
|
@ -221,6 +222,7 @@ void NetworkAddServer(const char *b);
|
|||
void NetworkRebuildHostList(void);
|
||||
bool NetworkChangeCompanyPassword(byte argc, char *argv[]);
|
||||
void NetworkPopulateCompanyInfo(void);
|
||||
void CheckMinPlayers(void);
|
||||
|
||||
#endif /* ENABLE_NETWORK */
|
||||
|
||||
|
|
|
@ -932,6 +932,8 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_QUIT)
|
|||
if (new_cs->status > STATUS_AUTH) {
|
||||
SEND_COMMAND(PACKET_SERVER_QUIT)(new_cs, cs->index, str);
|
||||
}
|
||||
|
||||
CheckMinPlayers();
|
||||
}
|
||||
|
||||
cs->quited = true;
|
||||
|
|
|
@ -1210,6 +1210,7 @@ static const SettingDescGlobVarList _network_settings[] = {
|
|||
SDTG_VAR("max_clients", SLE_UINT8, S, 0, _network_game_info.clients_max, 10, 0, 10, 0, STR_NULL, NULL),
|
||||
SDTG_VAR("max_spectators", SLE_UINT8, S, 0, _network_game_info.spectators_max, 10, 0, 10, 0, STR_NULL, NULL),
|
||||
SDTG_VAR("restart_game_year", SLE_INT32, S,D0, _network_restart_game_year, 0, MIN_YEAR, MAX_YEAR, 1, STR_NULL, NULL),
|
||||
SDTG_VAR("min_players", SLE_UINT8, S, 0, _network_min_players, 0, 0, 10, 0, STR_NULL, NULL),
|
||||
SDTG_END()
|
||||
};
|
||||
#endif /* ENABLE_NETWORK */
|
||||
|
|
Loading…
Reference in New Issue