OpenTTD Source: src/network/network_server.cpp File Reference

OpenTTD Source 14.0-beta1

Data Structures | Functions | Variables
network_server.cpp File Reference
`#include "../stdafx.h"`
`#include "../strings_func.h"`
`#include "core/network_game_info.h"`
`#include "network_admin.h"`
`#include "network_server.h"`
`#include "network_udp.h"`
`#include "network_base.h"`
`#include "../console_func.h"`
`#include "../company_base.h"`
`#include "../command_func.h"`
`#include "../saveload/saveload.h"`
`#include "../saveload/saveload_filter.h"`
`#include "../station_base.h"`
`#include "../genworld.h"`
`#include "../company_func.h"`
`#include "../company_gui.h"`
`#include "../company_cmd.h"`
`#include "../roadveh.h"`
`#include "../order_backup.h"`
`#include "../core/pool_func.hpp"`
`#include "../core/random_func.hpp"`
`#include "../rev.h"`
`#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>`
`#include "../safeguards.h"`

Go to the source code of this file.

## Data Structures
struct | PacketWriter
| Writing a savegame directly to a number of packets. More...

## Functions
static void | NetworkHandleCommandQueue (NetworkClientSocket *cs)
| Handle the command-queue of a socket. More...
void | NetworkServerSendChat (NetworkAction action, DestType desttype, int dest, const std::string &msg, ClientID from_id, int64_t data, bool from_admin)
| Send an actual chat message. More...
void | NetworkServerSendExternalChat (const std::string &source, TextColour colour, const std::string &user, const std::string &msg)
| Send a chat message from external source. More...
void | NetworkPopulateCompanyStats (NetworkCompanyStats *stats)
| Populate the company stats. More...
void | NetworkUpdateClientInfo (ClientID client_id)
| Send updated client info of a particular client. More...
static void | NetworkAutoCleanCompanies ()
| 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) 2) If a company is protected, protection is disabled after 3 years (for example) (and item 1. More...
bool | NetworkMakeClientNameUnique (std::string &name)
| Check whether a name is unique, and otherwise try to make it unique. More...
bool | NetworkServerChangeClientName (ClientID client_id, const std::string &new_name)
| Change the client name of the given client. More...
void | NetworkServerSetCompanyPassword (CompanyID company_id, const std::string &password, bool already_hashed)
| Set/Reset a company password on the server end. More...
void | NetworkServer_Tick (bool send_frame)
| This is called every tick if this is a _network_server. More...
static void | NetworkRestartMap ()
| Helper function to restart the map.
void | ChangeNetworkRestartTime (bool reset)
| Reset the automatic network restart time interval. More...
static void | NetworkCheckRestartMapYear ()
| Check if we want to restart the map based on the year.
void | NetworkServerShowStatusToConsole ()
| Show the status message of all clients on the console.
void | NetworkServerSendConfigUpdate ()
| Send Config Update.
void | NetworkServerUpdateGameInfo ()
| Update the server's NetworkServerGameInfo due to changes in settings.
void | NetworkServerUpdateCompanyPassworded (CompanyID company_id, bool passworded)
| Tell that a particular company is (not) passworded. More...
void | NetworkServerDoMove (ClientID client_id, CompanyID company_id)
| Handle the tid-bits of moving a client from one company to another. More...
void | NetworkServerSendRcon (ClientID client_id, TextColour colour_code, const std::string &string)
| Send an rcon reply to the client. More...
void | NetworkServerKickClient (ClientID client_id, const std::string &reason)
| Kick a single client. More...
uint | NetworkServerKickOrBanIP (ClientID client_id, bool ban, const std::string &reason)
| Ban, or kick, everyone joined from the given client's IP. More...
uint | NetworkServerKickOrBanIP (const std::string &ip, bool ban, const std::string &reason)
| Kick or ban someone based on an IP address. More...
bool | NetworkCompanyHasClients (CompanyID company)
| Check whether a particular company has clients. More...
void | NetworkPrintClients ()
| Print all the clients to the console.
void | NetworkServerNewCompany (const Company *c, NetworkClientInfo *ci)
| Perform all the server specific administration of a new company. More...

## Variables
static ClientID | _network_client_id = CLIENT_ID_FIRST
| The identifier counter for new clients (is never decreased)
NetworkClientSocketPool | _networkclientsocket_pool ("NetworkClientSocket")
| Make very sure the preconditions given in network_type.h are actually followed. More...
static IntervalTimer< TimerGameRealtime > | _network_restart_map_timer ({std::chrono::hours::zero(), TimerGameRealtime::UNPAUSED}, [](auto) { if(!_network_server) return;if(_settings_client.network.restart_hours==0) return;Debug(net, 3, "Auto-restarting map: {} hours played", _settings_client.network.restart_hours);NetworkRestartMap();})
| Timer to restart a network server automatically based on real-time hours played. More...
static IntervalTimer< TimerGameCalendar > | _calendar_network_yearly ({ TimerGameCalendar::YEAR, TimerGameCalendar::Priority::NONE }, [](auto) { if(!_network_server) return;NetworkCheckRestartMapYear();})
| Calendar yearly "callback". More...
static IntervalTimer< TimerGameEconomy > | _economy_network_yearly ({TimerGameEconomy::YEAR, TimerGameEconomy::Priority::NONE}, [](auto) { if(!_network_server) return;NetworkAdminUpdate(ADMIN_FREQUENCY_ANUALLY);})
| Economy yearly "callback". More...
static IntervalTimer< TimerGameEconomy > | _network_quarterly ({TimerGameEconomy::QUARTER, TimerGameEconomy::Priority::NONE}, [](auto) { if(!_network_server) return;NetworkAutoCleanCompanies();NetworkAdminUpdate(ADMIN_FREQUENCY_QUARTERLY);})
| Quarterly "callback". More...
static IntervalTimer< TimerGameEconomy > | _network_monthly ({TimerGameEconomy::MONTH, TimerGameEconomy::Priority::NONE}, [](auto) { if(!_network_server) return;NetworkAutoCleanCompanies();NetworkAdminUpdate(ADMIN_FREQUENCY_MONTHLY);})
| Economy monthly "callback". More...
static IntervalTimer< TimerGameEconomy > | _network_weekly ({TimerGameEconomy::WEEK, TimerGameEconomy::Priority::NONE}, [](auto) { if(!_network_server) return;NetworkAdminUpdate(ADMIN_FREQUENCY_WEEKLY);})
| Economy weekly "callback". More...
static IntervalTimer< TimerGameEconomy > | _economy_network_daily ({TimerGameEconomy::DAY, TimerGameEconomy::Priority::NONE}, [](auto) { if(!_network_server) return;NetworkAdminUpdate(ADMIN_FREQUENCY_DAILY);})
| Daily "callback". More...

## Detailed Description

Server part of the network protocol.

Definition in file network_server.cpp.

## Function Documentation

## ◆ ChangeNetworkRestartTime()

void ChangeNetworkRestartTime | ( | bool | reset | ) |

Reset the automatic network restart time interval.

Parameters

  reset | Whether to reset the timer to zero.

Definition at line 1918 of file network_server.cpp.

References _network_restart_map_timer, _network_server, _settings_client, ClientSettings::network, NetworkSettings::restart_hours, and TimerGameRealtime::UNPAUSED.

## ◆ NetworkAutoCleanCompanies()

static void NetworkAutoCleanCompanies | ( |  | ) |
| static

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) 2) If a company is protected, protection is disabled after 3 years (for example) (and item 1.

happens a year later)

Definition at line 1592 of file network_server.cpp.

References _network_company_states, _network_dedicated, _settings_client, NetworkSettings::autoclean_companies, NetworkSettings::autoclean_novehicles, NetworkSettings::autoclean_protected, NetworkSettings::autoclean_unprotected, CC_INFO, CCA_DELETE, CLIENT_ID_SERVER, NetworkClientInfo::client_playas, CRR_AUTOCLEAN, NetworkClientInfo::GetByClientID(), HasBit(), IConsolePrint(), INVALID_CLIENT_ID, Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_company_pool >::IsValidID(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_networkclientinfo_pool >::Iterate(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_company_pool >::Iterate(), NetworkCompanyState::months_empty, ClientSettings::network, NetworkServerUpdateCompanyPassworded(), NetworkCompanyState::password, and SetBit().

## ◆ NetworkCompanyHasClients()

bool NetworkCompanyHasClients | ( | CompanyID | company | ) |

Check whether a particular company has clients.

Parameters

  company | The company to check.

Returns
  True if at least one client is joined to the company.

Definition at line 2175 of file network_server.cpp.

References Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_networkclientinfo_pool >::Iterate().

Referenced by AdminCompanyResetCallback().

## ◆ NetworkHandleCommandQueue()

static void NetworkHandleCommandQueue | ( | NetworkClientSocket * | cs | ) |
| static

Handle the command-queue of a socket.

Parameters

  cs | The socket to handle the queue for.

Definition at line 1737 of file network_server.cpp.

## ◆ NetworkMakeClientNameUnique()

bool NetworkMakeClientNameUnique | ( | std::string & | name | ) |

Check whether a name is unique, and otherwise try to make it unique.

Parameters

  new_name | The name to check/modify.

Returns
  True if an unique name was achieved.

Definition at line 1657 of file network_server.cpp.

References CLIENT_ID_SERVER, NetworkClientInfo::client_name, NetworkClientInfo::GetByClientID(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_networkclientinfo_pool >::Iterate(), MAX_CLIENTS, and NETWORK_CLIENT_NAME_LENGTH.

Referenced by NetworkUpdateClientName().

## ◆ NetworkPopulateCompanyStats()

void NetworkPopulateCompanyStats | ( | NetworkCompanyStats * | stats | ) |

Populate the company stats.

Parameters

  stats | the stats to update

Definition at line 1533 of file network_server.cpp.

References Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_company_pool >::IsValidID(), Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_vehicle_pool >::Iterate(), MAX_COMPANIES, and VEH_TRAIN.

Referenced by ServerNetworkAdminSocketHandler::SendCompanyStats().

## ◆ NetworkServer_Tick()

void NetworkServer_Tick | ( | bool | send_frame | ) |

This is called every tick if this is a _network_server.

Parameters

  send_frame | Whether to send the frame to the clients.

Definition at line 1750 of file network_server.cpp.

References _frame_counter, _last_sync_frame, _settings_client, NetworkSettings::bytes_per_frame, NetworkSettings::bytes_per_frame_burst, ClientSettings::network, and NetworkSettings::sync_freq.

## ◆ NetworkServerChangeClientName()

bool NetworkServerChangeClientName | ( | ClientID | client_id,
|  | const std::string & | new_name
| ) |  |

Change the client name of the given client.

Parameters

  client_id | the client to change the name of
  new_name | the new name for the client

Returns
  true iff the name was changed

Definition at line 1696 of file network_server.cpp.

References NetworkClientInfo::GetByClientID(), and Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_networkclientinfo_pool >::Iterate().

## ◆ NetworkServerDoMove()

void NetworkServerDoMove | ( | ClientID | client_id,
|  | CompanyID | company_id
| ) |  |

Handle the tid-bits of moving a client from one company to another.

Parameters

  client_id | id of the client we want to move.
  company_id | id of the company we want to move the client to.

Returns
  void

Definition at line 2067 of file network_server.cpp.

References _network_dedicated, CLIENT_ID_SERVER, NetworkClientInfo::client_playas, COMPANY_SPECTATOR, NetworkClientInfo::GetByClientID(), NetworkUpdateClientInfo(), and SetLocalCompany().

Referenced by NetworkClientListWindow::OnClickCompanyJoin().

## ◆ NetworkServerKickClient()

void NetworkServerKickClient | ( | ClientID | client_id,
|  | const std::string & | reason
| ) |  |

Kick a single client.

Parameters

  client_id | The client to kick.
  reason | In case of kicking a client, specifies the reason for kicking the client.

Definition at line 2114 of file network_server.cpp.

References CLIENT_ID_SERVER.

Referenced by AdminClientKickCallback(), and NetworkServerKickOrBanIP().

## ◆ NetworkServerKickOrBanIP() [1/2]

uint NetworkServerKickOrBanIP | ( | ClientID | client_id,
|  | bool | ban,
|  | const std::string & | reason
| ) |  |

Ban, or kick, everyone joined from the given client's IP.

Parameters

  client_id | The client to check for.
  ban | Whether to ban or kick.
  reason | In case of kicking a client, specifies the reason for kicking the client.

Definition at line 2126 of file network_server.cpp.

Referenced by AdminClientBanCallback().

## ◆ NetworkServerKickOrBanIP() [2/2]

uint NetworkServerKickOrBanIP | ( | const std::string & | ip,
|  | bool | ban,
|  | const std::string & | reason
| ) |  |

Kick or ban someone based on an IP address.

Parameters

  ip | The IP address/range to ban/kick.
  ban | Whether to ban or just kick.
  reason | In case of kicking a client, specifies the reason for kicking the client.

Definition at line 2137 of file network_server.cpp.

References _network_ban_list, _redirect_console_to_client, CLIENT_ID_SERVER, and NetworkServerKickClient().

## ◆ NetworkServerNewCompany()

void NetworkServerNewCompany | ( | const Company * | c,
|  | NetworkClientInfo * | ci
| ) |  |

Perform all the server specific administration of a new company.

Parameters

  c | The newly created company; can't be nullptr.
  ci | The client information of the client that made the company; can be nullptr.

Definition at line 2223 of file network_server.cpp.

References _network_company_states, _network_server, NetworkClientInfo::client_id, NetworkClientInfo::client_name, NetworkClientInfo::client_playas, Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem< Tpool >::index, NetworkCompanyState::months_empty, NetworkAdminCompanyInfo(), NetworkServerSendChat(), NetworkServerUpdateCompanyPassworded(), NetworkUpdateClientInfo(), and NetworkCompanyState::password.

Referenced by CmdCompanyCtrl().

## ◆ NetworkServerSendChat()

void NetworkServerSendChat | ( | NetworkAction | action,
|  | DestType | desttype,
|  | int | dest,
|  | const std::string & | msg,
|  | ClientID | from_id,
|  | int64_t | data,
|  | bool | from_admin
| ) |  |

Send an actual chat message.

Parameters

  action | The action that's performed.
  desttype | The type of destination.
  dest | The actual destination index.
  msg | The actual message.
  from_id | The origin of the message.
  data | Arbitrary data.
  from_admin | Whether the origin is an admin or not.

Definition at line 1271 of file network_server.cpp.

References CLIENT_ID_SERVER, DESTTYPE_CLIENT, and NetworkClientInfo::GetByClientID().

Referenced by NetworkServerNewCompany().

## ◆ NetworkServerSendExternalChat()

void NetworkServerSendExternalChat | ( | const std::string & | source,
|  | TextColour | colour,
|  | const std::string & | user,
|  | const std::string & | msg
| ) |  |

Send a chat message from external source.

Parameters

  source | Name of the source this message came from.
  colour | TextColour to use for the message.
  user | Name of the user who sent the messsage.
  msg | The actual message.

Definition at line 1389 of file network_server.cpp.

## ◆ NetworkServerSendRcon()

void NetworkServerSendRcon | ( | ClientID | client_id,
|  | TextColour | colour_code,
|  | const std::string & | string
| ) |  |

Send an rcon reply to the client.

Parameters

  client_id | The identifier of the client.
  colour_code | The colour of the text.
  string | The actual reply.

Definition at line 2104 of file network_server.cpp.

Referenced by IConsolePrint().

## ◆ NetworkServerSetCompanyPassword()

void NetworkServerSetCompanyPassword | ( | CompanyID | company_id,
|  | const std::string & | password,
|  | bool | already_hashed
| ) |  |

Set/Reset a company password on the server end.

Parameters

  company_id | ID of the company the password should be changed for.
  password | The new password.
  already_hashed | Is the given password already hashed?

Definition at line 1720 of file network_server.cpp.

References _network_company_states, _settings_client, _settings_game, GameSettings::game_creation, GenerateCompanyPasswordHash(), GameCreationSettings::generation_seed, Company::IsValidHumanID(), ClientSettings::network, NetworkSettings::network_id, NetworkServerUpdateCompanyPassworded(), and NetworkCompanyState::password.

Referenced by AdminCompanyUnlockCallback(), and NetworkChangeCompanyPassword().

## ◆ NetworkServerUpdateCompanyPassworded()

void NetworkServerUpdateCompanyPassworded | ( | CompanyID | company_id,
|  | bool | passworded
| ) |  |

Tell that a particular company is (not) passworded.

Parameters

  company_id | The company that got/removed the password.
  passworded | Whether the password was received or removed.

Definition at line 2047 of file network_server.cpp.

References _network_company_passworded, Pool< Titem, Tindex, Tgrowth_step, Tmax_size, Tpool_type, Tcache, Tzero >::PoolItem<&_company_pool >::GetIfValid(), NetworkAdminCompanyUpdate(), NetworkCompanyIsPassworded(), SB(), SetWindowClassesDirty(), and WC_COMPANY.

Referenced by NetworkAutoCleanCompanies(), NetworkServerNewCompany(), and NetworkServerSetCompanyPassword().

## ◆ NetworkUpdateClientInfo()

void NetworkUpdateClientInfo | ( | ClientID | client_id | ) |

Send updated client info of a particular client.

Parameters

  client_id | The client to send it for.

Definition at line 1569 of file network_server.cpp.

References NetworkClientInfo::client_playas, TimerGameEconomy::date, TimerGameEconomy::date_fract, Debug, NetworkClientInfo::GetByClientID(), NetworkAdminClientUpdate(), and ServerNetworkGameSocketHandler::STATUS_AUTHORIZED.

Referenced by CmdCompanyCtrl(), NetworkServerDoMove(), and NetworkServerNewCompany().

## Variable Documentation

## ◆ _calendar_network_yearly

IntervalTimer<TimerGameCalendar> _calendar_network_yearly({ TimerGameCalendar::YEAR, TimerGameCalendar::Priority::NONE },[](auto) { if(!_network_server) return;NetworkCheckRestartMapYear();})
| static

Calendar yearly "callback".

Called whenever the calendar year changes.

## ◆ _economy_network_daily

IntervalTimer<TimerGameEconomy> _economy_network_daily({TimerGameEconomy::DAY, TimerGameEconomy::Priority::NONE},[](auto) { if(!_network_server) return;NetworkAdminUpdate(ADMIN_FREQUENCY_DAILY);})
| static

Daily "callback".

Called whenever the economy date changes.

## ◆ _economy_network_yearly

IntervalTimer<TimerGameEconomy> _economy_network_yearly({TimerGameEconomy::YEAR, TimerGameEconomy::Priority::NONE},[](auto) { if(!_network_server) return;NetworkAdminUpdate(ADMIN_FREQUENCY_ANUALLY);})
| static

Economy yearly "callback".

Called whenever the economy year changes.

## ◆ _network_monthly

IntervalTimer<TimerGameEconomy> _network_monthly({TimerGameEconomy::MONTH, TimerGameEconomy::Priority::NONE},[](auto) { if(!_network_server) return;NetworkAutoCleanCompanies();NetworkAdminUpdate(ADMIN_FREQUENCY_MONTHLY);})
| static

Economy monthly "callback".

Called whenever the economy month changes.

## ◆ _network_quarterly

IntervalTimer<TimerGameEconomy> _network_quarterly({TimerGameEconomy::QUARTER, TimerGameEconomy::Priority::NONE},[](auto) { if(!_network_server) return;NetworkAutoCleanCompanies();NetworkAdminUpdate(ADMIN_FREQUENCY_QUARTERLY);})
| static

Quarterly "callback".

Called whenever the economy quarter changes.

## ◆ _network_restart_map_timer

IntervalTimer<TimerGameRealtime> _network_restart_map_timer({std::chrono::hours::zero(), TimerGameRealtime::UNPAUSED},[](auto) { if(!_network_server) return; if(_settings_client.network.restart_hours==0) return;Debug(net, 3, "Auto-restarting map: {} hours played", _settings_client.network.restart_hours);NetworkRestartMap();})
| static

Timer to restart a network server automatically based on real-time hours played.

Initialized at zero to disable until settings are loaded.

Referenced by ChangeNetworkRestartTime().

## ◆ _network_weekly

IntervalTimer<TimerGameEconomy> _network_weekly({TimerGameEconomy::WEEK, TimerGameEconomy::Priority::NONE},[](auto) { if(!_network_server) return;NetworkAdminUpdate(ADMIN_FREQUENCY_WEEKLY);})
| static

Economy weekly "callback".

Called whenever the economy week changes.

## ◆ _networkclientsocket_pool

NetworkClientSocketPool _networkclientsocket_pool("NetworkClientSocket")

Make very sure the preconditions given in network_type.h are actually followed.

Yes... The pool with clients.