12#include "../strings_func.h"
13#include "../command_func.h"
14#include "../timer/timer_game_tick.h"
15#include "../timer/timer_game_economy.h"
28#include "../console_func.h"
29#include "../3rdparty/md5/md5.h"
30#include "../core/random_func.hpp"
31#include "../window_func.h"
32#include "../company_func.h"
33#include "../company_base.h"
34#include "../landscape_type.h"
36#include "../core/pool_func.hpp"
37#include "../gfx_func.h"
39#include "../misc_cmd.h"
40#ifdef DEBUG_DUMP_COMMANDS
41# include "../fileio_func.h"
47#include "../safeguards.h"
49#ifdef DEBUG_DUMP_COMMANDS
55bool _ddc_fastforward =
true;
82#ifdef NETWORK_SEND_DOUBLE_SEED
91extern std::string
GenerateUid(std::string_view subject);
99 return !NetworkClientSocket::Iterate().empty();
119 if (ci->client_id ==
client_id)
return ci;
155 if (cs->client_id ==
client_id)
return cs;
168static auto FindKey(
auto *authorized_keys, std::string_view authorized_key)
170 return std::ranges::find_if(*authorized_keys, [authorized_key](
auto &value) {
return StrEqualsIgnoreCase(value, authorized_key); });
180 return FindKey(
this, key) != this->end();
190 if (key.empty())
return false;
192 auto iter =
FindKey(
this, key);
193 if (iter != this->end())
return false;
195 this->emplace_back(key);
206 auto iter =
FindKey(
this, key);
207 if (iter == this->end())
return false;
214uint8_t NetworkSpectatorCount()
236 case NETWORK_ACTION_SERVER_MESSAGE:
238 string =
GetString(STR_NETWORK_SERVER_MESSAGE, str);
241 case NETWORK_ACTION_COMPANY_SPECTATOR:
243 string =
GetString(STR_NETWORK_MESSAGE_CLIENT_COMPANY_SPECTATE, name);
245 case NETWORK_ACTION_COMPANY_JOIN:
247 string =
GetString(STR_NETWORK_MESSAGE_CLIENT_COMPANY_JOIN, name, str);
249 case NETWORK_ACTION_COMPANY_NEW:
251 string =
GetString(STR_NETWORK_MESSAGE_CLIENT_COMPANY_NEW, name, std::move(data));
253 case NETWORK_ACTION_JOIN:
256 GetString(STR_NETWORK_MESSAGE_CLIENT_JOINED_ID, name, std::move(data)) :
257 GetString(STR_NETWORK_MESSAGE_CLIENT_JOINED, name);
259 case NETWORK_ACTION_LEAVE:
string =
GetString(STR_NETWORK_MESSAGE_CLIENT_LEFT, name, std::move(data));
break;
260 case NETWORK_ACTION_NAME_CHANGE:
string =
GetString(STR_NETWORK_MESSAGE_NAME_CHANGE, name, str);
break;
261 case NETWORK_ACTION_GIVE_MONEY:
string =
GetString(STR_NETWORK_MESSAGE_GIVE_MONEY, name, std::move(data), str);
break;
262 case NETWORK_ACTION_KICKED:
string =
GetString(STR_NETWORK_MESSAGE_KICKED, name, str);
break;
263 case NETWORK_ACTION_CHAT_COMPANY:
string =
GetString(self_send ? STR_NETWORK_CHAT_TO_COMPANY : STR_NETWORK_CHAT_COMPANY, name, str);
break;
264 case NETWORK_ACTION_CHAT_CLIENT:
string =
GetString(self_send ? STR_NETWORK_CHAT_TO_CLIENT : STR_NETWORK_CHAT_CLIENT, name, str);
break;
265 case NETWORK_ACTION_EXTERNAL_CHAT:
string =
GetString(STR_NETWORK_CHAT_EXTERNAL, std::move(data), name, str);
break;
266 default:
string =
GetString(STR_NETWORK_CHAT_ALL, name, str);
break;
273 std::ostringstream stream;
274 std::ostreambuf_iterator<char> iterator(stream);
276 std::string message = stream.str() + string;
284uint NetworkCalculateLag(
const NetworkClientSocket *cs)
286 int lag = cs->last_frame_server - cs->last_frame;
299void ShowNetworkError(
StringID error_string)
314 static const StringID network_error_strings[] = {
315 STR_NETWORK_ERROR_CLIENT_GENERAL,
316 STR_NETWORK_ERROR_CLIENT_DESYNC,
317 STR_NETWORK_ERROR_CLIENT_SAVEGAME,
318 STR_NETWORK_ERROR_CLIENT_CONNECTION_LOST,
319 STR_NETWORK_ERROR_CLIENT_PROTOCOL_ERROR,
320 STR_NETWORK_ERROR_CLIENT_NEWGRF_MISMATCH,
321 STR_NETWORK_ERROR_CLIENT_NOT_AUTHORIZED,
322 STR_NETWORK_ERROR_CLIENT_NOT_EXPECTED,
323 STR_NETWORK_ERROR_CLIENT_WRONG_REVISION,
324 STR_NETWORK_ERROR_CLIENT_NAME_IN_USE,
325 STR_NETWORK_ERROR_CLIENT_WRONG_PASSWORD,
326 STR_NETWORK_ERROR_CLIENT_COMPANY_MISMATCH,
327 STR_NETWORK_ERROR_CLIENT_KICKED,
328 STR_NETWORK_ERROR_CLIENT_CHEATER,
329 STR_NETWORK_ERROR_CLIENT_SERVER_FULL,
330 STR_NETWORK_ERROR_CLIENT_TOO_MANY_COMMANDS,
331 STR_NETWORK_ERROR_CLIENT_TIMEOUT_PASSWORD,
332 STR_NETWORK_ERROR_CLIENT_TIMEOUT_COMPUTER,
333 STR_NETWORK_ERROR_CLIENT_TIMEOUT_MAP,
334 STR_NETWORK_ERROR_CLIENT_TIMEOUT_JOIN,
335 STR_NETWORK_ERROR_CLIENT_INVALID_CLIENT_NAME,
336 STR_NETWORK_ERROR_CLIENT_NOT_ON_ALLOW_LIST,
337 STR_NETWORK_ERROR_CLIENT_NO_AUTHENTICATION_METHOD_AVAILABLE,
339 static_assert(
lengthof(network_error_strings) == NETWORK_ERROR_END);
341 if (err >= (ptrdiff_t)
lengthof(network_error_strings)) err = NETWORK_ERROR_GENERAL;
343 return network_error_strings[err];
355 switch (changed_mode) {
363 if (!paused && !changed)
return;
367 std::array<StringParameter, 5> params{};
368 auto it = params.begin();
374 str =
GetStringWithArgs(STR_NETWORK_SERVER_MESSAGE_GAME_STILL_PAUSED_1 + std::distance(params.begin(), it) - 1, {params.begin(), it});
377 switch (changed_mode) {
378 case PauseMode::Normal: reason = STR_NETWORK_SERVER_MESSAGE_GAME_REASON_MANUAL;
break;
379 case PauseMode::Join: reason = STR_NETWORK_SERVER_MESSAGE_GAME_REASON_CONNECTING_CLIENTS;
break;
383 default: NOT_REACHED();
385 str =
GetString(paused ? STR_NETWORK_SERVER_MESSAGE_GAME_PAUSED : STR_NETWORK_SERVER_MESSAGE_GAME_UNPAUSED, reason);
388 NetworkTextMessage(NETWORK_ACTION_SERVER_MESSAGE,
CC_DEFAULT,
false,
"", str);
422 for (
const NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
423 if (cs->status != NetworkClientSocket::STATUS_ACTIVE)
continue;
450 for (
const NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
451 if (cs->status >= NetworkClientSocket::STATUS_AUTHORIZED && cs->status < NetworkClientSocket::STATUS_ACTIVE)
return true;
477 std::string_view ip = connection_string;
478 if (company_id ==
nullptr)
return ip;
480 size_t offset = ip.find_last_of(
'#');
481 if (offset != std::string::npos) {
482 std::string_view company_string = ip.substr(offset + 1);
483 ip = ip.substr(0, offset);
485 uint8_t company_value;
486 auto [_, err] = std::from_chars(company_string.data(), company_string.data() + company_string.size(), company_value);
487 if (err == std::errc()) {
489 if (company_value > MAX_COMPANIES || company_value == 0) {
493 *company_id = (
CompanyID)(company_value - 1);
523 size_t port_offset = ip.find_last_of(
':');
524 size_t ipv6_close = ip.find_last_of(
']');
525 if (port_offset != std::string::npos && (ipv6_close == std::string::npos || ipv6_close < port_offset)) {
526 std::string_view port_string = ip.substr(port_offset + 1);
527 ip = ip.substr(0, port_offset);
528 std::from_chars(port_string.data(), port_string.data() + port_string.size(), port);
541 uint16_t port = default_port;
543 return std::string(ip) +
":" + std::to_string(port);
556 uint16_t port = default_port;
597 as->CloseConnection(
true);
601 for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
616 NetworkGameSocketHandler::ProcessDeferredDeletions();
629static void NetworkInitialize(
bool close_admins =
true)
642 std::string connection_string;
649 Debug(net, 9,
"Query::OnFailure(): connection_string={}", this->connection_string);
660 Debug(net, 9,
"Query::OnConnect(): connection_string={}", this->connection_string);
674 Debug(net, 9,
"NetworkQueryServer(): connection_string={}", connection_string);
680 TCPConnecter::Create<TCPQueryConnecter>(connection_string);
694 if (connection_string.empty())
return nullptr;
707 if (manually) item->
manually =
true;
708 if (never_expire) item->
version = INT32_MAX;
721 addresses->emplace_back(iter.c_str(), port);
725 if (addresses->empty()) {
726 addresses->emplace_back(
"", port);
733void NetworkRebuildHostList()
745 std::string connection_string;
752 Debug(net, 9,
"Client::OnFailure(): connection_string={}", this->connection_string);
754 ShowNetworkError(STR_NETWORK_ERROR_NOCONNECTION);
759 Debug(net, 9,
"Client::OnConnect(): connection_string={}", this->connection_string);
787 Debug(net, 9,
"NetworkClientConnectGame(): connection_string={}", connection_string);
799 if (_game_mode == GM_MENU) {
824 Debug(net, 9,
"status = CONNECTING");
826 ShowJoinStatusWindow();
831static void NetworkInitGameInfo()
833 FillStaticNetworkServerGameInfo();
861 if (!server_name.empty())
return true;
875 static const std::string fallback_client_name =
"Unnamed Client";
878 Debug(net, 1,
"No \"client_name\" has been set, using \"{}\" instead. Please set this now using the \"name <new name>\" command", fallback_client_name);
882 static const std::string fallback_server_name =
"Unnamed Server";
885 Debug(net, 1,
"No \"server_name\" has been set, using \"{}\" instead. Please set this now using the \"server_name <new name>\" command", fallback_server_name);
890bool NetworkServerStart()
902 NetworkInitialize(
false);
904 Debug(net, 5,
"Starting listeners for clients");
909 Debug(net, 5,
"Starting listeners for admins");
914 Debug(net, 5,
"Starting listeners for incoming server queries");
927 NetworkInitGameInfo();
957 if (c !=
nullptr && ci !=
nullptr) {
979 for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
1002 for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
1032 case SERVER_GAME_TYPE_LOCAL:
1036 case SERVER_GAME_TYPE_INVITE_ONLY:
1037 case SERVER_GAME_TYPE_PUBLIC:
1059 NetworkGameSocketHandler::ProcessDeferredDeletions();
1064static void NetworkSend()
1072 NetworkGameSocketHandler::ProcessDeferredDeletions();
1087 NetworkGameSocketHandler::ProcessDeferredDeletions();
1094void NetworkGameLoop()
1104 static TimerGameEconomy::Date last_log;
1111#ifdef DEBUG_DUMP_COMMANDS
1114 static TimerGameEconomy::Date next_date(0);
1115 static uint32_t next_date_fract;
1117 static bool check_sync_state =
false;
1118 static uint32_t sync_state[2];
1119 if (!f.has_value() && next_date == 0) {
1120 Debug(desync, 0,
"Cannot open commands.log");
1121 next_date = TimerGameEconomy::Date(1);
1124 while (f.has_value() && !feof(*f)) {
1126 if (cp !=
nullptr) {
1132 if (check_sync_state) {
1136 Debug(desync, 0,
"Sync check: {:08x}; {:02x}; mismatch expected {{{:08x}, {:08x}}}, got {{{:08x}, {:08x}}}",
1140 check_sync_state =
false;
1146 Debug(desync, 0,
"Skipping to next command at {:08x}:{:02x}", next_date, next_date_fract);
1147 if (cp !=
nullptr) {
1151 check_sync_state =
false;
1154 if (cp !=
nullptr || check_sync_state)
break;
1157 if (fgets(buff,
lengthof(buff), *f) ==
nullptr)
break;
1163 if (p ==
nullptr)
break;
1167 if (strncmp(p,
"cmd: ", 5) == 0
1168#ifdef DEBUG_FAILED_DUMP_COMMANDS
1169 || strncmp(p,
"cmdf: ", 6) == 0
1178 uint32_t next_date_raw;
1179 int ret = sscanf(p,
"%x; %x; %x; %x; %x; %255s", &next_date_raw, &next_date_fract, &company, &cmd, &cp->
err_msg, buffer);
1181 next_date = TimerGameEconomy::Date((int32_t)next_date_raw);
1186 std::vector<uint8_t> args;
1187 size_t arg_len = strlen(buffer);
1188 for (
size_t i = 0; i + 1 < arg_len; i += 2) {
1190 std::from_chars(buffer + i, buffer + i + 2, e, 16);
1191 args.emplace_back(e);
1194 }
else if (strncmp(p,
"join: ", 6) == 0) {
1196 uint32_t next_date_raw;
1197 int ret = sscanf(p + 6,
"%x; %x", &next_date_raw, &next_date_fract);
1198 next_date = TimerGameEconomy::Date((int32_t)next_date_raw);
1200 Debug(desync, 0,
"Injecting pause for join at {:08x}:{:02x}; please join when paused", next_date, next_date_fract);
1205 _ddc_fastforward =
false;
1206 }
else if (strncmp(p,
"sync: ", 6) == 0) {
1207 uint32_t next_date_raw;
1208 int ret = sscanf(p + 6,
"%x; %x; %x; %x", &next_date_raw, &next_date_fract, &sync_state[0], &sync_state[1]);
1209 next_date = TimerGameEconomy::Date((int32_t)next_date_raw);
1211 check_sync_state =
true;
1212 }
else if (strncmp(p,
"msg: ", 5) == 0 || strncmp(p,
"client: ", 8) == 0 ||
1213 strncmp(p,
"load: ", 6) == 0 || strncmp(p,
"save: ", 6) == 0 ||
1214 strncmp(p,
"warning: ", 9) == 0) {
1216#ifndef DEBUG_FAILED_DUMP_COMMANDS
1217 }
else if (strncmp(p,
"cmdf: ", 6) == 0) {
1218 Debug(desync, 0,
"Skipping replay of failed command: {}", p + 6);
1222 Debug(desync, 0,
"Trying to parse: {}", p);
1226 if (f.has_value() && feof(*f)) {
1227 Debug(desync, 0,
"End of commands.log");
1240 bool send_frame =
false;
1256#ifdef NETWORK_SEND_DOUBLE_SEED
1285 Debug(net, 3,
"Starting network");
1291 _network_game_info = {};
1293 NetworkInitialize();
1295 Debug(net, 3,
"Network online, multiplayer available");
1307 Debug(net, 3,
"Shutting down network");
1314#ifdef __EMSCRIPTEN__
1317void CDECL em_openttd_add_server(
const char *connection_string)
std::vector< NetworkAddress > NetworkAddressList
Type for a list of addresses.
constexpr bool Test(Tvalue_type value) const
Test if the value-th bit is set.
constexpr bool None() const
Test if none of the values are set.
constexpr Timpl & Set()
Set all bits.
constexpr bool Any(const Timpl &other) const
Test if any of the given values are set.
void SendReceive()
Check whether we received/can send some data from/to the content server and when that's the case hand...
void Register()
Register our server to receive our invite code.
void SendReceive()
Check whether we received/can send some data from/to the Game Coordinator server and when that's the ...
void CloseAllConnections()
Close all pending connection tokens.
NetworkRecvStatus CloseConnection(bool error=true) override
This will put this socket handler in a close state.
Class for handling the client side of the game connection.
static ClientNetworkGameSocketHandler * my_client
This is us!
static NetworkRecvStatus SendQuit()
Tell the server we would like to quit.
static bool Receive()
Check whether we received/can send some data from/to the server and when that's the case handle it ap...
static bool GameLoop()
Actual game loop for the client.
static void Send()
Send the packets of this socket handler.
NetworkRecvStatus CloseConnection(NetworkRecvStatus status) override
Close the network connection due to the given status.
Endian-aware buffer adapter that always writes values in little endian order.
Wrapper for (un)resolved network addresses; there's no reason to transform a numeric IP to a string a...
static void EnsureValidSecretKeyAndUpdatePublicKey(std::string &secret_key, std::string &public_key)
Ensures that the given secret key is valid, and when not overwrite it with a valid secret key.
bool Contains(std::string_view key) const
Check whether the given key is contains in these authorized keys.
bool Add(std::string_view key)
Add the given key to the authorized keys, when it is not already contained.
bool Remove(std::string_view key)
Remove the given key from the authorized keys, when it is exists.
ClientID client_id
Client identifier.
static void HTTPReceive()
Do the receiving for all HTTP connections.
static void QueryServer(SOCKET s, const std::string &connection_string)
Start to query a server based on an open socket.
static void SendReceive()
Check if any query needs to send or receive.
std::string connection_string
The connection string for this ServerAddress.
static ServerAddress Parse(const std::string &connection_string, uint16_t default_port, CompanyID *company_id=nullptr)
Convert a string containing either "hostname", "hostname:port" or invite code to a ServerAddress,...
Class for handling the server side of the game connection.
static void Send()
Send the packets for the server sockets.
static void WelcomeAll()
Send a Welcome packet to all connected admins.
static Pool::IterateWrapperFiltered< ServerNetworkAdminSocketHandler, ServerNetworkAdminSocketHandlerFilter > IterateActive(size_t from=0)
Returns an iterable ensemble of all active admin sockets.
Class for handling the server side of the game connection.
static ServerNetworkGameSocketHandler * GetByClientID(ClientID client_id)
Return the client state given it's client-identifier.
static void Send()
Send the packets for the server sockets.
static void AcceptConnection(SOCKET s, const NetworkAddress &address)
Handle the accepting of a connection to the server.
NetworkAddress client_address
IP-address of the client (so they can be banned)
Non blocking connection create to actually connect to servers.
void OnConnect(SOCKET s) override
Callback when the connection succeeded.
void OnFailure() override
Callback for when the connection attempt failed.
static void CheckCallbacks()
Check whether we need to call the callback, i.e.
static void KillAll()
Kill all connection attempts.
static bool Receive()
Handle the receiving of packets.
static bool Listen(uint16_t port)
Listen on a particular port.
static void CloseListeners()
Close the sockets we're listening on.
Non blocking connection to query servers for their game info.
void OnConnect(SOCKET s) override
Callback when the connection succeeded.
void OnFailure() override
Callback for when the connection attempt failed.
static constexpr TimerGameTick::Ticks DAY_TICKS
1 day is 74 ticks; TimerGameCalendar::date_fract used to be uint16_t and incremented by 885.
static Date date
Current date in days (day counter).
static DateFract date_fract
Fractional part of the day.
const char * GetCommandName(Commands cmd)
This function mask the parameter with CMD_ID_MASK and returns the name which belongs to the given com...
void NetworkSendCommand(Commands cmd, StringID err_message, CommandCallback *callback, CompanyID company, const CommandDataBuffer &cmd_data)
Prepare a DoCommand to be send over the network.
Commands
List of commands.
@ CMD_PAUSE
pause the game
CompanyID GetFirstPlayableCompanyID()
Get the index of the first available company.
CompanyID _current_company
Company currently doing an action.
static constexpr CompanyID COMPANY_SPECTATOR
The client is spectating.
static constexpr CompanyID COMPANY_NEW_COMPANY
The client wants a new company.
static const uint16_t NETWORK_DEFAULT_PORT
The default port of the game server (TCP & UDP)
void IConsoleCmdExec(const std::string &command_string, const uint recurse_count)
Execute a given command passed to us.
void IConsolePrint(TextColour colour_code, const std::string &string)
Handle the printing of text entered into the console or redirected there by any other means.
static const TextColour CC_DEFAULT
Default colour of the console.
void NetworkCoreShutdown()
Shuts down the network core (as that is needed for some platforms.
bool NetworkCoreInitialize()
Initializes the network core (as that is needed for some platforms.
@ NETWORK_RECV_STATUS_CLIENT_QUIT
The connection is lost gracefully. Other clients are already informed of this leaving client.
#define Debug(category, level, format_string,...)
Output a line of debugging information.
@ WL_ERROR
Errors (eg. saving/loading failed)
@ WL_CRITICAL
Critical errors, the MessageBox is shown in all cases.
void ShowErrorMessage(EncodedString &&summary_msg, int x, int y, const CommandCost &cc)
Display an error message in a window.
std::optional< FileHandle > FioFOpenFile(const std::string &filename, const char *mode, Subdirectory subdir, size_t *filesize)
Opens a OpenTTD file somewhere in a personal or global directory.
@ SAVE_DIR
Base directory for all savegames.
PauseModes _pause_mode
The current pause mode.
SwitchMode _switch_mode
The next mainloop command.
TextColour
Colour of the strings, see _string_colourmap in table/string_colours.h or docs/ottd-colourtext-palett...
void NetworkFindBroadcastIPs(NetworkAddressList *broadcast)
Find the IPv4 broadcast addresses; IPv6 uses a completely different strategy for broadcasting.
Resolving of hostnames/IPs.
void NetworkHTTPInitialize()
Initialize the HTTP socket handler.
void NetworkHTTPUninitialize()
Uninitialize the HTTP socket handler.
uint32_t _last_sync_frame
Used in the server to store the last time a sync packet was sent to clients.
void NetworkStartUp()
This tries to launch the network for a given OS.
bool _is_network_server
Does this client wants to be a network-server?
NetworkClientInfoPool _networkclientinfo_pool("NetworkClientInfo")
Make sure both pools have the same size.
void NetworkHandlePauseChange(PauseModes prev_mode, PauseMode changed_mode)
Handle the pause mode change so we send the right messages to the chat.
static uint NetworkCountActiveClients()
Counts the number of active clients connected.
StringList _network_host_list
The servers we know.
StringID GetNetworkErrorMsg(NetworkErrorCode err)
Retrieve the string id of an internal error number.
uint32_t _frame_counter_server
The frame_counter of the server, if in network-mode.
static void CheckPauseOnJoin()
Check whether we should pause on join.
NetworkAddressList _broadcast_list
List of broadcast addresses.
void NetworkQueryServer(const std::string &connection_string)
Query a server to fetch the game-info.
std::string NormalizeConnectionString(const std::string &connection_string, uint16_t default_port)
Normalize a connection string.
void NetworkClientJoinGame()
Actually perform the joining to the server.
static bool NetworkHasJoiningClient()
Checks whether there is a joining client.
static auto FindKey(auto *authorized_keys, std::string_view authorized_key)
Simple helper to find the location of the given authorized key in the authorized keys.
ClientID _redirect_console_to_client
If not invalid, redirect the console output to a client.
static void CheckClientAndServerName()
Check whether the client and server name are set, for a dedicated server and if not set them to some ...
void NetworkOnGameStart()
Perform tasks when the server is started.
std::string_view ParseCompanyFromConnectionString(const std::string &connection_string, CompanyID *company_id)
Parse the company part ("#company" postfix) of a connecting string.
uint32_t _frame_counter
The current frame.
bool _network_available
is network mode available?
uint8_t _network_reconnect
Reconnect timeout.
bool _networking
are we in networking mode?
static void InitializeNetworkPools(bool close_admins=true)
Resets the pools used for network clients, and the admin pool if needed.
StringList _network_ban_list
The banned clients.
std::string_view ParseFullConnectionString(const std::string &connection_string, uint16_t &port, CompanyID *company_id)
Converts a string to ip/port/company Format: IP:port::company.
bool _network_dedicated
are we a dedicated server?
bool HasClients()
Return whether there is any client connected or trying to connect at all.
static bool NetworkReceive()
Receives something from the network.
NetworkGameList * NetworkAddServer(const std::string &connection_string, bool manually, bool never_expire)
Validates an address entered as a string and adds the server to the list.
void NetworkDisconnect(bool close_admins)
We want to disconnect from the host/clients.
bool _network_server
network-server is active
std::string GenerateUid(std::string_view subject)
Generate an unique ID.
uint32_t _sync_seed_1
Seed to compare during sync checks.
uint32_t _sync_frame
The frame to perform the sync check.
void NetworkBackgroundLoop()
We have to do some (simple) background stuff that runs normally, even when we are not in multiplayer.
StringList _network_bind_list
The addresses to bind on.
static void CheckMinActiveClients()
Check if the minimum number of active clients has been reached and pause or unpause the game as appro...
ClientID _network_own_client_id
Our client identifier.
static void CheckPauseHelper(bool pause, PauseMode pm)
Helper function for the pause checkers.
bool NetworkClientConnectGame(const std::string &connection_string, CompanyID default_company, const std::string &join_server_password)
Join a client to the server at with the given connection string.
bool _network_first_time
Whether we have finished joining or not.
void NetworkShutDown()
This shuts the network down.
uint8_t _network_clients_connected
The amount of clients connected.
void GetBindAddresses(NetworkAddressList *addresses, uint16_t port)
Get the addresses to bind to.
NetworkAddress ParseConnectionString(const std::string &connection_string, uint16_t default_port)
Convert a string containing either "hostname" or "hostname:ip" to a NetworkAddress.
void NetworkUpdateServerGameType()
The setting server_game_type was updated; possibly we need to take some action.
bool NetworkCanJoinCompany(CompanyID company_id)
Returns whether the given company can be joined by this client.
void NetworkClose(bool close_admins)
Close current connections.
uint32_t _frame_counter_max
To where we may go with our clients.
bool NetworkValidateServerName(std::string &server_name)
Trim the given server name in place, i.e.
Server part of the admin network protocol.
Base core network types and some helper functions to access them.
void CDECL NetworkAddChatMessage(TextColour colour, uint duration, const std::string &message)
Add a text message to the 'chat window' to be shown.
NetworkJoinInfo _network_join
Information about the game to join to.
bool NetworkValidateOurClientName()
Convenience method for NetworkValidateClientName on _settings_client.network.client_name.
void NetworkClient_Connected()
Is called after a client is connected to the server.
Client part of the network protocol.
void NetworkFreeLocalCommandQueue()
Free the local command queues.
void NetworkExecuteLocalCommandQueue()
Execute all commands on the local command queue that ought to be executed this frame.
void NetworkDistributeCommands()
Distribute the commands of ourself and the clients.
ClientNetworkContentSocketHandler _network_content_client
The client we use to connect to the server.
Part of the network protocol handling content distribution.
ClientNetworkCoordinatorSocketHandler _network_coordinator_client
The connection to the Game Coordinator.
Part of the network protocol handling Game Coordinator requests.
void NetworkServerNewCompany(const Company *company, NetworkClientInfo *ci)
Perform all the server specific administration of a new company.
void NetworkServerUpdateGameInfo()
Update the server's NetworkServerGameInfo due to changes in settings.
NetworkGameList * NetworkGameListAddItem(const std::string &connection_string)
Add a new item to the linked gamelist.
NetworkGameList * _network_game_list
Game list of this client.
Handling of the list of games.
@ NGLS_OFFLINE
Server is offline (or cannot be queried).
NetworkJoinStatus _network_join_status
The status of joining.
void UpdateNetworkGameWindow()
Update the network new window because a new server is found on the network.
GUIs related to networking.
Query part of the network protocol.
void ChangeNetworkRestartTime(bool reset)
Reset the automatic network restart time interval.
void NetworkServer_Tick(bool send_frame)
This is called every tick if this is a _network_server.
Server part of the network protocol.
@ DESTTYPE_CLIENT
Send message/notice to only a certain client (Private)
NetworkErrorCode
The error codes we send around in the protocols.
NetworkAction
Actions that can be used for NetworkTextMessage.
ClientID
'Unique' identifier to be given to clients
@ CLIENT_ID_SERVER
Servers always have this ID.
void NetworkUDPClose()
Close all UDP related stuff.
void NetworkUDPInitialize()
Initialize the whole UDP bit.
void NetworkUDPServerListen()
Start the listening of the UDP server component.
void NetworkBackgroundUDPLoop()
Receive the UDP packets.
Sending and receiving UDP messages.
void ClearGRFConfigList(GRFConfigList &config)
Clear a GRF Config list, freeing all nodes.
void StateGameLoop()
State controlling game loop.
PauseMode
Modes of pausing we've got.
@ LinkGraph
A game paused due to the link graph schedule lagging.
@ Error
A game paused because a (critical) error.
@ GameScript
A game paused by a game script.
@ ActiveClients
A game paused for 'min_active_clients'.
@ Normal
A game normally paused.
@ Join
A game paused for 'pause_on_join'.
@ SM_JOIN_GAME
Join a network game.
@ SM_MENU
Switch to game intro menu.
#define INSTANTIATE_POOL_METHODS(name)
Force instantiation of pool methods so we don't get linker errors.
@ NetworkClient
Network client pools.
@ NetworkAdmin
Network admin pool.
Randomizer _random
Random used in the game state calculations.
ClientSettings _settings_client
The current settings for this game.
#define lengthof(array)
Return the length of an fixed size array.
bool StrEqualsIgnoreCase(const std::string_view str1, const std::string_view str2)
Compares two string( view)s for equality, while ignoring the case of the characters.
std::string FormatArrayAsHex(std::span< const uint8_t > data)
Format a byte array into a continuous hex string.
void StrTrimInPlace(std::string &str)
Trim the spaces from given string in place, i.e.
size_t Utf8Encode(T buf, char32_t c)
Encode a unicode character and place it in the buffer.
static const char32_t CHAR_TD_LRM
The next character acts like a left-to-right character.
static const char32_t CHAR_TD_RLM
The next character acts like a right-to-left character.
std::vector< std::string > StringList
Type for a list of strings.
void GetStringWithArgs(StringBuilder &builder, StringID string, StringParameters &args, uint case_index, bool game_script)
Get a parsed string with most special stringcodes replaced by the string parameters.
EncodedString GetEncodedString(StringID str)
Encode a string with no parameters into an encoded string.
std::string GetString(StringID string)
Resolve the given StringID into a std::string with formatting but no parameters.
TextDirection _current_text_dir
Text direction of the currently selected language.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
@ TD_LTR
Text is written left-to-right by default.
NetworkSettings network
settings related to the network
GUISettings gui
settings related to the GUI
Everything we need to know about a command to be able to execute it.
StringID err_msg
string ID of error message to use.
CommandDataBuffer data
command parameters.
CompanyID company
company that is executing the command
Commands cmd
command being executed.
Defines the traits of a command.
NetworkAuthorizedKeys allow_list
Public keys of clients that are allowed to join this company.
StringID name_1
Name of the company if the user did not change it.
std::string name
Name of the company if the user changed it.
uint16_t network_chat_timeout
timeout of chat messages in seconds
Container for all information known about a client.
static NetworkClientInfo * GetByClientID(ClientID client_id)
Return the CI given it's client-identifier.
~NetworkClientInfo()
Basically a client is leaving us right now.
bool CanJoinCompany(CompanyID company_id) const
Returns whether the given company can be joined by this client.
CompanyID client_playas
As which company is this client playing (CompanyID)
ClientID client_id
Client identifier (same as ClientState->client_id)
std::string client_name
Name of the client.
std::string public_key
The public key of the client.
Structure with information shown in the game list (GUI)
int version
Used to see which servers are no longer available on the Game Coordinator and can be removed.
bool refreshing
Whether this server is being queried.
bool manually
True if the server was added manually.
NetworkGameList * next
Next pointer to make a linked game list.
NetworkGameListStatus status
Stats of the server.
NetworkGameInfo info
The game information of this server.
std::string connection_string
The address of the server to join.
std::string server_password
The password of the server to join.
CompanyID company
The company to join.
GRFConfigList grfconfig
List of NewGRF files used.
std::string server_name
Server name.
uint8_t clients_on
Current count of clients on server.
std::string client_secret_key
The secret key of the client for authorized key logins.
std::string client_name
name of the player (as client)
ServerGameType server_game_type
Server type: local / public / invite-only.
std::string client_public_key
The public key of the client for authorized key logins.
uint8_t frame_freq
how often do we send commands to the clients
uint8_t min_active_clients
minimum amount of active clients to unpause the game
uint16_t server_port
port the server listens on
std::string last_joined
Last joined server.
std::string server_name
name of the server
uint16_t server_admin_port
port the server listens on for the admin network
bool pause_on_join
pause the game when people join
static void Clean(PoolTypes)
Clean all pools of given type.
static Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid Titem.
Tindex index
Index of this pool item.
static bool CanAllocateItem(size_t n=1)
Helper functions so we can use PoolItem::Function() instead of _poolitem_pool.Function()
static bool IsValidID(auto index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
static Titem * GetIfValid(auto index)
Returns Titem with given index.
Base class for all pools.
static constexpr size_t MAX_SIZE
Make template parameter accessible from outside.
uint32_t state[2]
The state of the randomizer.
The data required to format and validate a single parameter of a string.
Basic functions to receive and send UDP packets.
void CloseWindowById(WindowClass cls, WindowNumber number, bool force, int data)
Close a window by its class and window number (if it is open).
void InvalidateWindowData(WindowClass cls, WindowNumber number, int data, bool gui_scope)
Mark window data of the window of a given class and specific window number as invalid (in need of re-...
@ WN_NETWORK_STATUS_WINDOW_JOIN
Network join status.
@ WC_SEND_NETWORK_MSG
Chatbox; Window numbers:
@ WC_CLIENT_LIST
Client list; Window numbers:
@ WC_NETWORK_STATUS_WINDOW
Network status window; Window numbers: