10 #include "../stdafx.h" 11 #include "../strings_func.h" 12 #include "../date_func.h" 17 #include "../console_func.h" 18 #include "../company_base.h" 19 #include "../command_func.h" 20 #include "../saveload/saveload.h" 21 #include "../saveload/saveload_filter.h" 22 #include "../station_base.h" 23 #include "../genworld.h" 24 #include "../company_func.h" 25 #include "../company_gui.h" 26 #include "../roadveh.h" 27 #include "../order_backup.h" 28 #include "../core/pool_func.hpp" 29 #include "../core/random_func.hpp" 32 #include <condition_variable> 34 #include "../safeguards.h" 57 ServerNetworkGameSocketHandler *
cs;
68 PacketWriter(ServerNetworkGameSocketHandler *cs) : SaveFilter(nullptr), cs(cs), current(nullptr), total_size(0), packets(nullptr)
75 std::unique_lock<std::mutex>
lock(this->mutex);
77 if (this->cs !=
nullptr) this->exit_sig.wait(lock);
81 while (this->packets !=
nullptr) {
102 std::unique_lock<std::mutex>
lock(this->mutex);
106 this->exit_sig.notify_all();
125 return this->packets !=
nullptr;
133 std::lock_guard<std::mutex>
lock(this->mutex);
135 Packet *p = this->packets;
136 this->packets = p->
next;
145 if (this->current ==
nullptr)
return;
147 Packet **p = &this->packets;
148 while (*p !=
nullptr) {
153 this->current =
nullptr;
156 void Write(byte *buf,
size_t size)
override 159 if (this->cs ==
nullptr)
SlError(STR_NETWORK_ERROR_LOSTCONNECTION);
163 std::lock_guard<std::mutex>
lock(this->mutex);
165 byte *bufe = buf + size;
166 while (buf != bufe) {
168 memcpy(this->current->
buffer + this->current->size, buf, to_write);
178 this->total_size += size;
184 if (this->cs ==
nullptr)
SlError(STR_NETWORK_ERROR_LOSTCONNECTION);
186 std::lock_guard<std::mutex>
lock(this->mutex);
198 this->cs->NetworkTCPSocketHandler::SendPacket(p);
256 if (this->
sock == INVALID_SOCKET)
return status;
264 NetworkTextMessage(NETWORK_ACTION_LEAVE,
CC_DEFAULT,
false, client_name,
nullptr, STR_NETWORK_ERROR_CLIENT_CONNECTION_LOST);
267 for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
269 new_cs->SendErrorQuit(this->
client_id, NETWORK_ERROR_CONNECTION_LOST);
280 _network_clients_connected--;
312 for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
355 memset(clients, 0,
sizeof(clients));
363 for (NetworkClientSocket *csi : NetworkClientSocket::Iterate()) {
389 if (
StrEmpty(clients[company->index])) {
422 GetString(str, strid,
lastof(str));
430 DEBUG(net, 1,
"'%s' made an error and has been disconnected. Reason: '%s'", client_name, str);
432 if (error == NETWORK_ERROR_KICKED && reason !=
nullptr) {
433 NetworkTextMessage(NETWORK_ACTION_KICKED,
CC_DEFAULT,
false, client_name, reason, strid);
435 NetworkTextMessage(NETWORK_ACTION_LEAVE,
CC_DEFAULT,
false, client_name,
nullptr, strid);
438 for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
442 if (error == NETWORK_ERROR_NOT_AUTHORIZED || error == NETWORK_ERROR_NOT_EXPECTED || error == NETWORK_ERROR_WRONG_REVISION) {
443 error = NETWORK_ERROR_ILLEGAL_PACKET;
445 new_cs->SendErrorQuit(this->
client_id, error);
451 DEBUG(net, 1,
"Client %d made an error and has been disconnected. Reason: '%s'", this->
client_id, str);
531 for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
547 for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
561 static uint sent_packets;
565 return this->
SendError(NETWORK_ERROR_NOT_AUTHORIZED);
590 bool has_packets =
false;
592 for (uint i = 0; (has_packets = this->
savegame->
HasPackets()) && i < sent_packets; i++) {
614 NetworkClientSocket *best =
nullptr;
615 for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
617 if (best ==
nullptr || best->GetInfo()->join_date > new_cs->GetInfo()->join_date || (best->GetInfo()->join_date == new_cs->GetInfo()->join_date && best->client_id > new_cs->client_id)) {
624 if (best !=
nullptr) {
630 for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
642 if (has_packets) sent_packets *= 2;
651 if (sent_packets > 1) sent_packets /= 2;
678 #ifdef ENABLE_NETWORK_SYNC_EVERY_FRAME 680 #ifdef NETWORK_SEND_DOUBLE_SEED 687 this->
last_token = InteractiveRandomRange(UINT8_MAX - 1) + 1;
702 #ifdef NETWORK_SEND_DOUBLE_SEED 860 return this->
SendError(NETWORK_ERROR_NOT_EXPECTED);
881 return this->
SendError(NETWORK_ERROR_NOT_EXPECTED);
889 p->
Recv_string(client_revision,
sizeof(client_revision));
895 return this->
SendError(NETWORK_ERROR_WRONG_REVISION);
908 return this->
SendError(NETWORK_ERROR_FULL);
913 return this->
SendError(NETWORK_ERROR_FULL);
918 return this->
SendError(NETWORK_ERROR_COMPANY_MISMATCH);
928 return this->
SendError(NETWORK_ERROR_NAME_IN_USE);
956 return this->
SendError(NETWORK_ERROR_NOT_EXPECTED);
966 return this->
SendError(NETWORK_ERROR_WRONG_PASSWORD);
981 return this->
SendError(NETWORK_ERROR_NOT_EXPECTED);
994 return this->
SendError(NETWORK_ERROR_WRONG_PASSWORD);
1004 if (this->status < STATUS_AUTHORIZED || this->
HasClientQuit()) {
1005 return this->
SendError(NETWORK_ERROR_NOT_AUTHORIZED);
1009 for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
1029 NetworkTextMessage(NETWORK_ACTION_JOIN,
CC_DEFAULT,
false, client_name,
nullptr, this->
client_id);
1043 for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
1045 new_cs->SendClientInfo(this->
GetInfo());
1060 return this->
SendError(NETWORK_ERROR_NOT_EXPECTED);
1071 if (this->status < STATUS_DONE_MAP || this->
HasClientQuit()) {
1072 return this->
SendError(NETWORK_ERROR_NOT_EXPECTED);
1076 return this->
SendError(NETWORK_ERROR_TOO_MANY_COMMANDS);
1086 if (err !=
nullptr) {
1088 return this->
SendError(NETWORK_ERROR_NOT_EXPECTED);
1094 return this->
SendError(NETWORK_ERROR_KICKED);
1099 return this->
SendError(NETWORK_ERROR_KICKED);
1108 IConsolePrintF(
CC_ERROR,
"WARNING: client %d (IP: %s) tried to execute a command as company %d, kicking...",
1110 return this->
SendError(NETWORK_ERROR_COMPANY_MISMATCH);
1115 return this->
SendError(NETWORK_ERROR_CHEATER);
1140 if (this->status < STATUS_DONE_MAP || this->
HasClientQuit()) {
1147 GetString(str, strid,
lastof(str));
1149 DEBUG(net, 2,
"'%s' reported an error and is closing its connection (%s)", client_name, str);
1151 NetworkTextMessage(NETWORK_ACTION_LEAVE,
CC_DEFAULT,
false, client_name,
nullptr, strid);
1153 for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
1155 new_cs->SendErrorQuit(this->
client_id, errorno);
1171 if (this->status < STATUS_DONE_MAP || this->
HasClientQuit()) {
1177 NetworkTextMessage(NETWORK_ACTION_LEAVE,
CC_DEFAULT,
false, client_name,
nullptr, STR_NETWORK_MESSAGE_CLIENT_LEAVING);
1179 for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
1194 return this->
SendError(NETWORK_ERROR_NOT_AUTHORIZED);
1256 if (ci !=
nullptr) {
1265 for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
1266 if (cs->client_id == (
ClientID)dest) {
1267 cs->SendChat(action, from_id,
false, msg, data);
1278 if (ci !=
nullptr && ci_to !=
nullptr) {
1282 for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
1283 if (cs->client_id == from_id) {
1284 cs->SendChat(action, (
ClientID)dest,
true, msg, data);
1293 bool show_local =
true;
1296 for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
1299 cs->SendChat(action, from_id,
false, msg, data);
1300 if (cs->client_id == from_id) show_local =
false;
1312 if (ci !=
nullptr && ci_own !=
nullptr && ci_own->
client_playas == dest) {
1319 if (ci_to ==
nullptr)
break;
1322 if (ci !=
nullptr && show_local) {
1327 GetString(name, str,
lastof(name));
1330 for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
1331 if (cs->client_id == from_id) {
1332 cs->SendChat(action, ci_to->
client_id,
true, msg, data);
1340 DEBUG(net, 0,
"[server] received unknown chat destination type %d. Doing broadcast instead", desttype);
1344 for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
1345 cs->SendChat(action, from_id,
false, msg, data);
1351 if (ci !=
nullptr) {
1362 return this->
SendError(NETWORK_ERROR_NOT_AUTHORIZED);
1375 case NETWORK_ACTION_GIVE_MONEY:
1378 case NETWORK_ACTION_CHAT:
1379 case NETWORK_ACTION_CHAT_CLIENT:
1380 case NETWORK_ACTION_CHAT_COMPANY:
1385 return this->
SendError(NETWORK_ERROR_NOT_EXPECTED);
1394 return this->
SendError(NETWORK_ERROR_NOT_EXPECTED);
1411 return this->
SendError(NETWORK_ERROR_NOT_EXPECTED);
1422 if (ci !=
nullptr) {
1446 DEBUG(net, 0,
"[rcon] wrong password from client-id %d", this->
client_id);
1450 DEBUG(net, 0,
"[rcon] client-id %d executed: '%s'", this->
client_id, command);
1475 DEBUG(net, 2,
"[move] wrong password from client-id #%d for company #%d", this->
client_id, company_id + 1);
1498 assert(max_len <=
lengthof(company_name));
1499 GetString(company_name, STR_COMPANY_NAME, company_name + max_len - 1);
1526 for (uint i = 0; i < NETWORK_VEH_END; i++) {
1530 for (uint i = 0; i < NETWORK_VEH_END; i++) {
1550 case VEH_TRAIN: type = NETWORK_VEH_TRAIN;
break;
1553 case VEH_SHIP: type = NETWORK_VEH_SHIP;
break;
1581 if (ci ==
nullptr)
return;
1585 for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
1586 cs->SendClientInfo(ci);
1596 DEBUG(net, 0,
"Auto-restarting map. Year %d reached",
_cur_year);
1628 memset(clients_in_company, 0,
sizeof(clients_in_company));
1632 if (
Company::IsValidID(ci->client_playas)) clients_in_company[ci->client_playas] =
true;
1641 memset(vehicles_in_company, 0,
sizeof(vehicles_in_company));
1645 vehicles_in_company[v->owner]++;
1652 if (c->is_ai)
continue;
1654 if (!clients_in_company[c->index]) {
1693 bool found_name =
false;
1699 while (!found_name) {
1702 if (strcmp(ci->client_name, new_name) == 0) {
1710 if (ci !=
nullptr) {
1711 if (strcmp(ci->
client_name, new_name) == 0) found_name =
false;
1719 seprintf(new_name, last,
"%s #%d", original_name, number);
1736 if (strcmp(ci->client_name, new_name) == 0)
return false;
1740 if (ci ==
nullptr)
return false;
1760 if (!already_hashed) {
1775 while ((cp = cs->outgoing_queue.Pop()) !=
nullptr) {
1776 cs->SendCommand(cp);
1787 #ifndef ENABLE_NETWORK_SYNC_EVERY_FRAME 1788 bool send_sync =
false;
1791 #ifndef ENABLE_NETWORK_SYNC_EVERY_FRAME 1800 for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
1807 uint lag = NetworkCalculateLag(cs);
1808 switch (cs->status) {
1809 case NetworkClientSocket::STATUS_ACTIVE:
1814 "Client #%d is dropped because the client's game state is more than %d ticks behind" :
1816 "Client #%d is dropped because the client did not respond for more than %d ticks",
1817 cs->client_id, lag);
1818 cs->SendError(NETWORK_ERROR_TIMEOUT_COMPUTER);
1835 cs->SendError(NETWORK_ERROR_TIMEOUT_COMPUTER);
1840 case NetworkClientSocket::STATUS_INACTIVE:
1841 case NetworkClientSocket::STATUS_NEWGRFS_CHECK:
1842 case NetworkClientSocket::STATUS_AUTHORIZED:
1847 cs->SendError(NETWORK_ERROR_TIMEOUT_COMPUTER);
1852 case NetworkClientSocket::STATUS_MAP:
1856 cs->SendError(NETWORK_ERROR_TIMEOUT_MAP);
1861 case NetworkClientSocket::STATUS_DONE_MAP:
1862 case NetworkClientSocket::STATUS_PRE_ACTIVE:
1866 cs->SendError(NETWORK_ERROR_TIMEOUT_JOIN);
1871 case NetworkClientSocket::STATUS_AUTH_GAME:
1872 case NetworkClientSocket::STATUS_AUTH_COMPANY:
1876 cs->SendError(NETWORK_ERROR_TIMEOUT_PASSWORD);
1881 case NetworkClientSocket::STATUS_MAP_WAIT:
1886 case NetworkClientSocket::STATUS_END:
1891 if (cs->status >= NetworkClientSocket::STATUS_PRE_ACTIVE) {
1896 if (send_frame) cs->SendFrame();
1898 #ifndef ENABLE_NETWORK_SYNC_EVERY_FRAME 1900 if (send_sync) cs->SendSync();
1943 static const char *
const stat_str[] = {
1946 "authorizing (server password)",
1947 "authorizing (company password)",
1957 for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
1959 if (ci ==
nullptr)
continue;
1960 uint lag = NetworkCalculateLag(cs);
1963 status = (cs->status < (ptrdiff_t)
lengthof(stat_str) ? stat_str[cs->status] :
"unknown");
1976 for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
1977 if (cs->status >= NetworkClientSocket::STATUS_PRE_ACTIVE) cs->SendConfigUpdate();
1993 for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
1994 if (cs->status >= NetworkClientSocket::STATUS_PRE_ACTIVE) cs->SendCompanyUpdate();
2021 NetworkClientSocket *cs = NetworkClientSocket::GetByClientID(client_id);
2023 if (cs->status < NetworkClientSocket::STATUS_AUTHORIZED)
return;
2024 cs->SendMove(client_id, company_id);
2042 NetworkClientSocket::GetByClientID(client_id)->SendRConResult(colour_code,
string);
2053 NetworkClientSocket::GetByClientID(client_id)->SendError(NETWORK_ERROR_KICKED, reason);
2077 bool contains =
false;
2084 if (!contains) _network_ban_list.emplace_back(ip);
2094 for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
2097 if (cs->client_address.IsInNetmask(ip)) {
2114 if (ci->client_playas == company)
return true;
2147 ci->client_id ==
CLIENT_ID_SERVER ?
"server" : NetworkClientSocket::GetByClientID(ci->client_id)->GetClientIP());
2164 assert(c !=
nullptr);
2172 if (ci !=
nullptr) {
2182 if (ci !=
nullptr) {
Packet * packets
Packet queue of the savegame; send these "slowly" to the client.
static const uint NETWORK_CLIENT_NAME_LENGTH
The maximum length of a client's name, in bytes including '\0'.
NetworkRecvStatus SendMap()
This sends the map to the client.
static const uint NETWORK_CLIENTS_LENGTH
The maximum length for the list of clients that controls a company, in bytes including '\0'...
Owner
Enum for all companies/owners.
void NetworkServer_Tick(bool send_frame)
This is called every tick if this is a _network_server.
Send message/notice to all clients (All)
bool server_admin_chat
allow private chat for the server to be distributed to the admin network
void NetworkAdminCompanyUpdate(const Company *company)
Notify the admin network of company updates.
GameSettings _settings_game
Game settings of a running game or the scenario editor.
used in multiplayer to create a new companies etc.
The client is catching up the delayed frames.
static bool AllowConnection()
Whether an connection is allowed or not at this moment.
static Titem * GetIfValid(size_t index)
Returns Titem with given index.
void NetworkServerSendChat(NetworkAction action, DestType desttype, int dest, const char *msg, ClientID from_id, int64 data, bool from_admin)
Send an actual chat message.
Information about a single company.
Server tells everyone that someone is moved to another company.
NetworkRecvStatus SendNeedCompanyPassword()
Request the company password.
static void NetworkAutoCleanCompanies()
Check if the server has autoclean_companies activated Two things happen: 1) If a company is not prote...
NetworkRecvStatus SendCompanyUpdate()
Send an update about the company password states.
void NetworkSendCommand(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallback *callback, const char *text, CompanyID company)
Prepare a DoCommand to be send over the network.
bool IsNetworkCompatibleVersion(const char *other)
Checks whether the given version string is compatible with our version.
bool HasClientQuit() const
Whether the current client connected to the socket has quit.
Container for all information known about a client.
The client has downloaded the map.
SOCKET sock
The socket currently connected to.
NetworkRecvStatus SendJoin(ClientID client_id)
Tell that a client joined.
uint32 _sync_seed_1
Seed to compare during sync checks.
uint32 _realtime_tick
The real time in the game.
Internal entity of a packet.
ServerNetworkGameSocketHandler * cs
Socket we are associated with.
The connection got closed.
void SetWindowDirty(WindowClass cls, WindowNumber number)
Mark window as dirty (in need of repainting)
GRFConfig * _grfconfig
First item in list of current GRF set up.
TextColour GetDrawStringCompanyColour(CompanyID company)
Get the colour for DrawString-subroutines which matches the colour of the company.
static char * strecat(char *dst, const char *src, const char *last)
Appends characters from one string to another.
uint32 Recv_uint32()
Read a 32 bits integer from the packet.
Client list; Window numbers:
void NetworkServerMonthlyLoop()
Monthly "callback".
uint16 max_init_time
maximum amount of time, in game ticks, a client may take to initiate joining
byte last_token
The last random token we did send to verify the client is listening.
set p2 with the ClientID of the sending client.
A server tells that a client has hit an error and did quit.
int32 performance_history
Company score (scale 0-1000)
NetworkRecvStatus Receive_CLIENT_CHAT(Packet *p) override
Sends a chat-packet to the server: uint8 ID of the action (see NetworkAction).
ServerNetworkGameSocketHandler(SOCKET s)
Create a new socket for the server side of the game connection.
void NetworkServerSendRcon(ClientID client_id, TextColour colour_code, const char *string)
Send an rcon reply to the client.
int CDECL seprintf(char *str, const char *last, const char *format,...)
Safer implementation of snprintf; same as snprintf except:
Load game, Play Scenario.
int receive_limit
Amount of bytes that we can receive at this moment.
static void ResetUser(uint32 user)
Reset an user's OrderBackup if needed.
void Send_string(const char *data)
Sends a string over the network.
Year inaugurated_year
Year of starting the company.
The server is full and has no place for you.
static ClientID _network_client_id
The identifier counter for new clients (is never decreased)
NetworkErrorCode
The error codes we send around in the protocols.
NetworkRecvStatus SendCommand(const CommandPacket *cp)
Send a command to the client to execute.
ClientID client_id
Client identifier (same as ClientState->client_id)
NetworkRecvStatus Receive_CLIENT_ERROR(Packet *p) override
The client made an error and is quitting the game.
void NORETURN SlError(StringID string, const char *extra_msg)
Error handler.
void NetworkPopulateCompanyStats(NetworkCompanyStats *stats)
Populate the company stats.
The client is downloading the map.
FileToSaveLoad _file_to_saveload
File to save or load in the openttd loop.
Popup for the client list; Window numbers:
void Write(byte *buf, size_t size) override
Write a given number of bytes into the savegame.
uint8 autoclean_novehicles
remove companies with no vehicles after this many months
NetworkRecvStatus CloseConnection(NetworkRecvStatus status) override
Close the network connection due to the given status.
ClientStatus status
Status of this client.
The client wants a new company.
void Send_uint8(uint8 data)
Package a 8 bits integer in the packet.
NetworkRecvStatus SendClientInfo(NetworkClientInfo *ci)
Send the client information about a client.
NetworkRecvStatus SendWait()
Tell the client that its put in a waiting queue.
Template for TCP listeners.
The client is authorizing with company password.
static const uint MAX_CLIENTS
How many clients can we have.
Sending and receiving UDP messages.
GRF file is used statically (can be used in any MP game)
NetworkRecvStatus SendError(NetworkErrorCode error, const char *reason=nullptr)
Send an error to the client, and close its connection.
The client is active within in the game.
NetworkRecvStatus SendChat(NetworkAction action, ClientID client_id, bool self_send, const char *msg, int64 data)
Send a chat message.
ClientID _redirect_console_to_client
If not invalid, redirect the console output to a client.
SaveOrLoadResult SaveWithFilter(SaveFilter *writer, bool threaded)
Save the game using a (writer) filter.
Tindex index
Index of this pool item.
NetworkRecvStatus Receive_CLIENT_MOVE(Packet *p) override
Request the server to move this client into another company: uint8 ID of the company the client wants...
static const int DAY_TICKS
1 day is 74 ticks; _date_fract used to be uint16 and incremented by 885.
bool NetworkServerChangeClientName(ClientID client_id, const char *new_name)
Change the client name of the given client.
Send message/notice to only a certain client (Private)
void Send_uint32(uint32 data)
Package a 32 bits integer in the packet.
Server distributing the message of a client (or itself).
#define lastof(x)
Get the last element of an fixed size array.
static const TextColour CC_DEFAULT
Default colour of the console.
bool NetworkCompanyIsPassworded(CompanyID company_id)
Check if the company we want to join requires a password.
void NetworkPrintClients()
Print all the clients to the console.
static Pool::IterateWrapper< Station > Iterate(size_t from=0)
Returns an iterable ensemble of all valid stations of type T.
Base core network types and some helper functions to access them.
uint16 bytes_per_frame_burst
how many bytes may, over a short period, be received?
bool HasPackets()
Checks whether there are packets.
void Append(CommandPacket *p)
Append a CommandPacket at the end of the queue.
Server tells the client what frame it is in, and thus to where the client may progress.
NetworkRecvStatus SendRConResult(uint16 colour, const char *command)
Send the result of a console action.
GRFIdentifier ident
grfid and md5sum to uniquely identify newgrfs
ClientID
'Unique' identifier to be given to clients
The admin gets information about this on a daily basis.
CommandFlags GetCommandFlags(uint32 cmd)
The server told us we made an error.
Year _cur_year
Current year, starting at 0.
NetworkRecvStatus SendNewGRFCheck()
Send the check for the NewGRFs.
virtual Packet * ReceivePacket()
Receives a packet for the given client.
static RoadVehicle * From(Vehicle *v)
Converts a Vehicle to SpecializedVehicle with type checking.
SendPacketsState SendPackets(bool closing_down=false)
Sends all the buffered packets out for this client.
Server tells the client what the random state should be.
Class for handling the server side of the game connection.
struct GRFConfig * next
NOSAVE: Next item in the linked list.
NetworkRecvStatus Receive_CLIENT_GETMAP(Packet *p) override
Request the map from the server.
The client is not connected nor active.
static T SB(T &x, const uint8 s, const uint8 n, const U d)
Set n bits in x starting at bit s to d.
void NetworkUDPAdvertise()
Register us to the master server This function checks if it needs to send an advertise.
StringID GetNetworkErrorMsg(NetworkErrorCode err)
Retrieve the string id of an internal error number.
Server welcomes you and gives you your ClientID.
NetworkRecvStatus Receive_CLIENT_COMMAND(Packet *p) override
The client has done a command and wants us to handle it.
static const uint32 GENERATE_NEW_SEED
Create a new random seed.
static bool IsValidHumanID(size_t index)
Is this company a valid company, not controlled by a NoAI program?
The admin gets information about this on a monthly basis.
bool _network_dedicated
are we a dedicated server?
Server tells the client that it is beginning to send the map.
CommandQueue incoming_queue
The command-queue awaiting handling.
assert_compile(MAX_CLIENT_SLOTS > MAX_CLIENTS)
Make very sure the preconditions given in network_type.h are actually followed.
uint16 months_empty
How many months the company is empty.
bool autoclean_companies
automatically remove companies that are not in use
void ProcessAsyncSaveFinish()
Handle async save finishes.
Response of the executed command on the server.
uint16 num_vehicle[NETWORK_VEH_END]
How many vehicles are there of this type?
static const size_t MAX_SIZE
Make template parameter accessible from outside.
A server tells that a client has quit.
void NetworkServerNewCompany(const Company *c, NetworkClientInfo *ci)
Perform all the server specific administration of a new company.
Server distributes a command to (all) the clients.
The company is removed due to autoclean.
void NetworkAdminClientQuit(ClientID client_id)
Notify the admin network that a client quit (if they have opt in for the respective update)...
char password[NETWORK_PASSWORD_LENGTH]
The password for the company.
size_t total_size
Total size of the compressed savegame.
Server sends NewGRF IDs and MD5 checksums for the client to check.
void NetworkAdminUpdate(AdminUpdateFrequency freq)
Send (push) updates to the admin network as they have registered for these updates.
void GetClientName(char *client_name, const char *last) const
Get the name of the client, if the user did not send it yet, Client ID is used.
NetworkSettings network
settings related to the network
CompanyID client_playas
As which company is this client playing (CompanyID)
void NetworkUpdateClientInfo(ClientID client_id)
Send updated client info of a particular client.
static const uint NETWORK_RCONCOMMAND_LENGTH
The maximum length of a rconsole command, in bytes including '\0'.
Load a heightmap and start a new game from it.
uint32 last_frame
Last frame we have executed.
void Send_uint64(uint64 data)
Package a 64 bits integer in the packet.
void NetworkSyncCommandQueue(NetworkClientSocket *cs)
Sync our local command queue to the command queue of the given socket.
Server sends you information about a client.
DateFract _date_fract
Fractional part of the day.
byte * buffer
The buffer of this packet, of basically variable length up to SEND_MTU.
NetworkAddress client_address
IP-address of the client (so he can be banned)
uint16 max_lag_time
maximum amount of time, in game ticks, a client may be lagging behind the server
The client is spectating.
Information about GRF, used in the game and (part of it) in savegames.
void SendCompanyInformation(Packet *p, const struct Company *c, const struct NetworkCompanyStats *stats, uint max_len=NETWORK_COMPANY_NAME_LENGTH)
Package some generic company information into a packet.
char client_name[NETWORK_CLIENT_NAME_LENGTH]
Name of the client.
Server part of the network protocol.
uint8 max_spectators
maximum amount of spectators
void Send_uint16(uint16 data)
Package a 16 bits integer in the packet.
Server sends bits of the map to the client.
NetworkRecvStatus Receive_CLIENT_MAP_OK(Packet *p) override
Tell the server that we are done receiving/loading the map.
void NetworkAdminClientError(ClientID client_id, NetworkErrorCode error_code)
Notify the admin network of a client error (if they have opt in for the respective update)...
ClientSettings _settings_client
The current settings for this game.
void Finish() override
Prepare everything to finish writing the savegame.
std::mutex lock
synchronization for playback status fields
void CDECL IConsolePrintF(TextColour colour_code, const char *format,...)
Handle the printing of text entered into the console or redirected there by any other means...
void NetworkServerSetCompanyPassword(CompanyID company_id, const char *password, bool already_hashed)
Set/Reset a company password on the server end.
The client is waiting as someone else is downloading the map.
The admin gets information about this on a quarterly basis.
static void NetworkHandleCommandQueue(NetworkClientSocket *cs)
Handle the command-queue of a socket.
void CDECL usererror(const char *s,...)
Error handling for fatal user errors.
void SetLocalCompany(CompanyID new_company)
Sets the local company and updates the settings that are set on a per-company basis to reflect the co...
TextColour
Colour of the strings, see _string_colourmap in table/string_colours.h or docs/ottd-colourtext-palett...
static void NetworkCheckRestartMap()
Check if we want to restart the map.
NetworkRecvStatus SendNeedGamePassword()
Request the game password.
NetworkCompanyState * _network_company_states
Statistics about some companies.
GameSettings _settings_newgame
Game settings for new games (updated from the intro screen).
The client is authorizing with game (server) password.
static const uint MILLISECONDS_PER_TICK
The number of milliseconds per game tick.
NetworkRecvStatus Receive_CLIENT_COMPANY_PASSWORD(Packet *p) override
Send a password to the server to authorize uint8 Password type (see NetworkPasswordType).
NetworkRecvStatus Receive_CLIENT_RCON(Packet *p) override
Send an RCon command to the server: string RCon password.
uint8 flags
NOSAVE: GCF_Flags, bitset.
NetworkRecvStatus
Status of a network client; reasons why a client has quit.
Writing a savegame directly to a number of packets.
const char * GetHostname()
Get the hostname; in case it wasn't given the IPv4 dotted representation is given.
All packets in the queue are sent.
byte clients_on
Current count of clients on server.
static const uint NETWORK_CHAT_LENGTH
The maximum length of a chat message, in bytes including '\0'.
bool is_ai
If true, the company is (also) controlled by the computer (a NoAI program).
Money money
Money owned by the company.
virtual Packet * ReceivePacket() override
Receives a packet for the given client.
uint16 max_commands_in_queue
how many commands may there be in the incoming queue before dropping the connection?
void NetworkAdminChat(NetworkAction action, DestType desttype, ClientID client_id, const char *msg, int64 data, bool from_admin)
Send chat to the admin network (if they did opt in for the respective update).
PacketSize size
The size of the whole packet for received packets.
NetworkLanguage
Language ids for server_lang and client_lang.
bool DoCommandP(const CommandContainer *container, bool my_cmd)
Shortcut for the long DoCommandP when having a container with the data.
CompanyID company
company that is executing the command
#define lengthof(x)
Return the length of an fixed size array.
NetworkServerGameInfo _network_game_info
Information about our game.
The buffer is still full, so no (parts of) packets could be sent.
uint last_packet
Time we received the last frame.
static T min(const T a, const T b)
Returns the minimum of two values.
char rcon_password[NETWORK_PASSWORD_LENGTH]
password for rconsole (server side)
NetworkClientInfo * GetInfo() const
Gets the client info of this socket handler.
The client is checking NewGRFs.
void NetworkAdminClientInfo(const NetworkClientSocket *cs, bool new_client)
Notify the admin network of a new client (if they did opt in for the respective update).
uint32 frame
the frame in which this packet is executed
the command can only be initiated by the server
uint32 StringID
Numeric value that represents a string, independent of the selected language.
Server sending an error message to the client.
NetworkRecvStatus SendFrame()
Tell the client that they may run to a particular frame.
uint Count() const
Get the number of items in the queue.
NetworkRecvStatus SendNewGame()
Tell the client we're starting a new game.
Packet * next
The next packet.
Date join_date
Gamedate the client has joined.
Packet * PopPacket()
Pop a single created packet from the queue with packets.
Base class for all pools.
uint8 max_companies
maximum amount of companies
uint16 sync_freq
how often do we check whether we are still in-sync
NetworkRecvStatus SendQuit(ClientID client_id)
Tell the client another client quit.
The connection is 'just' lost.
the command may be initiated by a spectator
#define DEBUG(name, level,...)
Output a line of debugging information.
uint8 autoclean_unprotected
remove passwordless companies after this many months
ClientID client_id
Client identifier.
Month _cur_month
Current month (0..11)
NetworkRecvStatus SendSync()
Request the client to sync.
uint32 last_frame_server
Last frame the server has executed.
#define INSTANTIATE_POOL_METHODS(name)
Force instantiation of pool methods so we don't get linker errors.
void DeleteWindowById(WindowClass cls, WindowNumber number, bool force)
Delete a window by its class and window number (if it is open).
NetworkRecvStatus SendWelcome()
Send the client a welcome message with some basic information.
uint16 max_password_time
maximum amount of time, in game ticks, a client may take to enter the password
byte _network_clients_connected
The amount of clients connected.
bool NetworkCompanyHasClients(CompanyID company)
Check whether a particular company has clients.
bool IsBus() const
Check whether a roadvehicle is a bus.
uint8 Recv_uint8()
Read a 8 bits integer from the packet.
NetworkRecvStatus Receive_CLIENT_JOIN(Packet *p) override
Try to join the server: string OpenTTD revision (norev000 if no revision).
Tells clients that a new client has joined.
uint32 generation_seed
noise seed for world generation
Some network configuration important to the client changed.
The admin gets information about this on a yearly basis.
NetworkRecvStatus SendCompanyInfo()
Send the client information about the companies.
static Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid Titem.
void SetInfo(NetworkClientInfo *info)
Sets the client info for this socket handler.
uint32 _frame_counter
The current frame.
uint64 Recv_uint64()
Read a 64 bits integer from the packet.
void Destroy()
Begin the destruction of this packet writer.
static bool StrEmpty(const char *s)
Check if a string buffer is empty.
void IConsoleCmdExec(const char *cmdstr, const uint recurse_count)
Execute a given command passed to us.
static size_t GetNumItems()
Returns number of valid items in the pool.
NetworkRecvStatus SendConfigUpdate()
Send an update about the max company/spectator counts.
char network_id[NETWORK_SERVER_ID_LENGTH]
network ID for servers
const char * GetClientIP()
Get the IP address/hostname of the connected client.
The admin gets information about this on a weekly basis.
CompanyMask _network_company_passworded
Bitmask of the password status of all companies.
The server is preparing to start a new game.
void NetworkServerDailyLoop()
Daily "callback".
The client is authorized.
uint8 max_clients
maximum amount of clients
std::condition_variable exit_sig
Signal for threaded destruction of this packet writer.
static const uint NETWORK_COMPANY_NAME_LENGTH
The maximum length of the company name, in bytes including '\0'.
PacketWriter(ServerNetworkGameSocketHandler *cs)
Create the packet writer.
void CDECL error(const char *s,...)
Error handling for fatal non-user errors.
void NetworkServerUpdateCompanyPassworded(CompanyID company_id, bool passworded)
Tell that a particular company is (not) passworded.
Server tells it has just sent the last bits of the map to the client.
Server tells the client what the (compressed) size of the map is.
change the president name
uint16 num_station[NETWORK_VEH_END]
How many stations are there of this type?
CompanyEconomyEntry old_economy[MAX_HISTORY_QUARTERS]
Economic data of the company of the last MAX_HISTORY_QUARTERS quarters.
Server tells the client there are some people waiting for the map as well.
char * strecpy(char *dst, const char *src, const char *last)
Copies characters from one buffer to another.
void NetworkServerYearlyLoop()
Yearly "callback".
void AppendQueue()
Append the current packet to the queue.
void NetworkAdminCompanyInfo(const Company *company, bool new_company)
Notify the admin network of company details.
Maximum number of companies.
void NetworkServerSendConfigUpdate()
Send Config Update.
StringList _network_ban_list
The banned clients.
std::mutex mutex
Mutex for making threaded saving safe.
SwitchMode _switch_mode
The next mainloop command.
const char * GenerateCompanyPasswordHash(const char *password, const char *password_server_id, uint32 password_game_seed)
Hash the given password using server ID and game seed.
const char * ReceiveCommand(Packet *p, CommandPacket *cp)
Receives a command from the network.
static bool CanAllocateItem(size_t n=1)
Helper functions so we can use PoolItem::Function() instead of _poolitem_pool.Function() ...
NetworkClientSocketPool _networkclientsocket_pool("NetworkClientSocket")
The pool with clients.
bool NetworkFindName(char *new_name, const char *last)
Check whether a name is unique, and otherwise try to make it unique.
The packets are partly sent; there are more packets to be sent in the queue.
NetworkRecvStatus SendShutdown()
Tell the client we're shutting down.
static const uint16 SEND_MTU
Number of bytes we can pack in a single packet.
NetworkRecvStatus Receive_CLIENT_ACK(Packet *p) override
Tell the server we are done with this frame: uint32 Current frame counter of the client.
NetworkRecvStatus Receive_CLIENT_GAME_PASSWORD(Packet *p) override
Send a password to the server to authorize: uint8 Password type (see NetworkPasswordType).
bool _network_server
network-server is active
static bool IsValidID(size_t index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
AbstractFileType abstract_ftype
Abstract type of file (scenario, heightmap, etc).
~PacketWriter()
Make sure everything is cleaned up.
static const TextColour CC_ERROR
Colour for error lines.
uint32 _last_sync_frame
Used in the server to store the last time a sync packet was sent to clients.
Everything we need to know about a command to be able to execute it.
static const uint MAX_CLIENT_SLOTS
The number of slots; must be at least 1 more than MAX_CLIENTS.
Server requests the (hashed) game password.
Client is not part of anything.
NetworkRecvStatus SendMove(ClientID client_id, CompanyID company_id)
Tell that a client moved to another company.
NetworkRecvStatus SendErrorQuit(ClientID client_id, NetworkErrorCode errorno)
Tell the client another client quit with an error.
uint32 last_token_frame
The last frame we received the right token.
Money yearly_expenses[3][EXPENSES_END]
Expenses of the company for the last three years, in every ExpensesType category. ...
We apparently send a malformed packet.
static void free(const void *ptr)
Version of the standard free that accepts const pointers.
NetworkRecvStatus Receive_CLIENT_QUIT(Packet *p) override
The client is quitting the game.
Server requests the (hashed) company password.
static const uint NETWORK_NAME_LENGTH
The maximum length of the server name and map name, in bytes including '\0'.
virtual void SendPacket(Packet *packet)
This function puts the packet in the send-queue and it is send as soon as possible.
Simple calculated statistics of a company.
uint16 max_download_time
maximum amount of time, in game ticks, a client may take to download the map
static const uint NETWORK_PASSWORD_LENGTH
The maximum length of the password, in bytes including '\0' (must be >= NETWORK_SERVER_ID_LENGTH) ...
void NetworkAdminClientUpdate(const NetworkClientInfo *ci)
Notify the admin network of a client update (if they did opt in for the respective update)...
static bool HasBit(const T x, const uint8 y)
Checks if a bit in a value is set.
Station with truck stops.
Servers always have this ID.
#define DECLARE_POSTFIX_INCREMENT(enum_type)
Some enums need to have allowed incrementing (i.e.
uint16 bytes_per_frame
how many bytes may, over a long period, be received per frame?
GameCreationSettings game_creation
settings used during the creation of a game (map)
The server has banned you.
uint NetworkServerKickOrBanIP(ClientID client_id, bool ban, const char *reason)
Ban, or kick, everyone joined from the given client's IP.
NetworkRecvStatus Receive_CLIENT_NEWGRFS_CHECKED(Packet *p) override
Tell the server that we have the required GRFs.
uint8 autoclean_protected
remove the password from passworded companies after this many months
Base socket handler for all TCP sockets.
void Send_bool(bool data)
Package a boolean in the packet.
Station with train station.
uint16 max_join_time
maximum amount of time, in game ticks, a client may take to sync up during joining ...
Money company_value
The value of the company.
static NetworkClientInfo * GetByClientID(ClientID client_id)
Return the CI given it's client-identifier.
static const byte NETWORK_COMPANY_INFO_VERSION
What version of company info is this?
Interface for filtering a savegame till it is written.
NetworkRecvStatus Receive_CLIENT_COMPANY_INFO(Packet *p) override
Request company information (in detail).
char server_password[NETWORK_PASSWORD_LENGTH]
password for joining this server
void SendCommand(Packet *p, const CommandPacket *cp)
Sends a command over the network.
static const uint NETWORK_REVISION_LENGTH
The maximum length of the revision, in bytes including '\0'.
void SetWindowClassesDirty(WindowClass cls)
Mark all windows of a particular class as dirty (in need of repainting)
bool my_cmd
did the command originate from "me"
~ServerNetworkGameSocketHandler()
Clear everything related to this client.
void NetworkServerDoMove(ClientID client_id, CompanyID company_id)
Handle the tid-bits of moving a client from one company to another.
Date _date
Current date in days (day counter)
The server is shutting down.
Company view; Window numbers:
uint16 PacketSize
Size of the whole packet.
void NetworkServerShowStatusToConsole()
Show the status message of all clients on the console.
static const TextColour CC_WARNING
Colour for warning lines.
void SendGRFIdentifier(Packet *p, const GRFIdentifier *grf)
Serializes the GRFIdentifier (GRF ID and MD5 checksum) to the packet.
Send message/notice to everyone playing the same company (Team)
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
void NetworkServerKickClient(ClientID client_id, const char *reason)
Kick a single client.
uint32 _frame_counter_max
To where we may go with our clients.
static void Send()
Send the packets for the server sockets.
uint32 cmd
command being executed.
DestType
Destination of our chat messages.
NetworkRecvStatus Receive_CLIENT_SET_NAME(Packet *p) override
Gives the client a new name: string New name of the client.
New Game –> 'Random game'.
byte client_lang
The language of the client.
NetworkAction
Actions that can be used for NetworkTextMessage.
NetworkRecvStatus Receive_CLIENT_SET_PASSWORD(Packet *p) override
Set the password for the clients current company: string The password.
Information (password) of a company changed.
static const TextColour CC_INFO
Colour for information lines.
Year restart_game_year
year the server restarts
struct PacketWriter * savegame
Writer used to write the savegame.
void Recv_string(char *buffer, size_t size, StringValidationSettings settings=SVS_REPLACE_WITH_QUESTION_MARK)
Reads a string till it finds a '\0' in the stream.
Server part of the admin network protocol.
Packet * current
The packet we're currently writing to.
static void SetDParam(uint n, uint64 v)
Set a string parameter v at index n in the global string parameter array.