OpenTTD Source  14.0-RC3
network_server.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of OpenTTD.
3  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6  */
7 
10 #include "../stdafx.h"
11 #include "../strings_func.h"
12 #include "core/network_game_info.h"
13 #include "network_admin.h"
14 #include "network_server.h"
15 #include "network_udp.h"
16 #include "network_base.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 "../company_cmd.h"
27 #include "../roadveh.h"
28 #include "../order_backup.h"
29 #include "../core/pool_func.hpp"
30 #include "../core/random_func.hpp"
31 #include "../company_cmd.h"
32 #include "../rev.h"
33 #include "../timer/timer.h"
34 #include "../timer/timer_game_calendar.h"
35 #include "../timer/timer_game_economy.h"
36 #include "../timer/timer_game_realtime.h"
37 #include <mutex>
38 #include <condition_variable>
39 
40 #include "../safeguards.h"
41 
42 
43 /* This file handles all the server-commands */
44 
48 
50 static_assert(MAX_CLIENT_SLOTS > MAX_CLIENTS);
52 static_assert(NetworkClientSocketPool::MAX_SIZE == MAX_CLIENT_SLOTS);
53 
56 INSTANTIATE_POOL_METHODS(NetworkClientSocket)
57 
60 
64  std::unique_ptr<Packet> current;
65  size_t total_size;
66  std::deque<std::unique_ptr<Packet>> packets;
67  std::mutex mutex;
68  std::condition_variable exit_sig;
69 
74  PacketWriter(ServerNetworkGameSocketHandler *cs) : SaveFilter(nullptr), cs(cs), total_size(0)
75  {
76  }
77 
80  {
81  std::unique_lock<std::mutex> lock(this->mutex);
82 
83  if (this->cs != nullptr) this->exit_sig.wait(lock);
84 
85  /* This must all wait until the Destroy function is called. */
86 
87  this->packets.clear();
88  this->current = nullptr;
89  }
90 
101  void Destroy()
102  {
103  std::unique_lock<std::mutex> lock(this->mutex);
104 
105  this->cs = nullptr;
106 
107  this->exit_sig.notify_all();
108  lock.unlock();
109 
110  /* Make sure the saving is completely cancelled. Yes,
111  * we need to handle the save finish as well as the
112  * next connection might just be requesting a map. */
113  WaitTillSaved();
114  }
115 
123  {
124  /* Unsafe check for the queue being empty or not. */
125  if (this->packets.empty()) return false;
126 
127  std::lock_guard<std::mutex> lock(this->mutex);
128 
129  while (!this->packets.empty()) {
130  bool last_packet = this->packets.front()->GetPacketType() == PACKET_SERVER_MAP_DONE;
131  socket->SendPacket(std::move(this->packets.front()));
132  this->packets.pop_front();
133 
134  if (last_packet) return true;
135  }
136 
137  return false;
138  }
139 
140  void Write(byte *buf, size_t size) override
141  {
142  /* We want to abort the saving when the socket is closed. */
143  if (this->cs == nullptr) SlError(STR_NETWORK_ERROR_LOSTCONNECTION);
144 
145  if (this->current == nullptr) this->current = std::make_unique<Packet>(PACKET_SERVER_MAP_DATA, TCP_MTU);
146 
147  std::lock_guard<std::mutex> lock(this->mutex);
148 
149  byte *bufe = buf + size;
150  while (buf != bufe) {
151  size_t written = this->current->Send_bytes(buf, bufe);
152  buf += written;
153 
154  if (!this->current->CanWriteToPacket(1)) {
155  this->packets.push_back(std::move(this->current));
156  if (buf != bufe) this->current = std::make_unique<Packet>(PACKET_SERVER_MAP_DATA, TCP_MTU);
157  }
158  }
159 
160  this->total_size += size;
161  }
162 
163  void Finish() override
164  {
165  /* We want to abort the saving when the socket is closed. */
166  if (this->cs == nullptr) SlError(STR_NETWORK_ERROR_LOSTCONNECTION);
167 
168  std::lock_guard<std::mutex> lock(this->mutex);
169 
170  /* Make sure the last packet is flushed. */
171  if (this->current != nullptr) this->packets.push_back(std::move(this->current));
172 
173  /* Add a packet stating that this is the end to the queue. */
174  this->packets.push_back(std::make_unique<Packet>(PACKET_SERVER_MAP_DONE));
175 
176  /* Fast-track the size to the client. */
177  auto p = std::make_unique<Packet>(PACKET_SERVER_MAP_SIZE);
178  p->Send_uint32((uint32_t)this->total_size);
179  this->packets.push_front(std::move(p));
180  }
181 };
182 
183 
189 {
190  this->status = STATUS_INACTIVE;
191  this->client_id = _network_client_id++;
193 
194  Debug(net, 9, "client[{}] status = INACTIVE", this->client_id);
195 
196  /* The Socket and Info pools need to be the same in size. After all,
197  * each Socket will be associated with at most one Info object. As
198  * such if the Socket was allocated the Info object can as well. */
200 }
201 
206 {
207  delete this->GetInfo();
208 
211 
212  if (this->savegame != nullptr) {
213  this->savegame->Destroy();
214  this->savegame = nullptr;
215  }
216 }
217 
219 {
220  /* Only allow receiving when we have some buffer free; this value
221  * can go negative, but eventually it will become positive again. */
222  if (this->receive_limit <= 0) return nullptr;
223 
224  /* We can receive a packet, so try that and if needed account for
225  * the amount of received data. */
226  std::unique_ptr<Packet> p = this->NetworkTCPSocketHandler::ReceivePacket();
227  if (p != nullptr) this->receive_limit -= p->Size();
228  return p;
229 }
230 
232 {
233  assert(status != NETWORK_RECV_STATUS_OKAY);
234  /*
235  * Sending a message just before leaving the game calls cs->SendPackets.
236  * This might invoke this function, which means that when we close the
237  * connection after cs->SendPackets we will close an already closed
238  * connection. This handles that case gracefully without having to make
239  * that code any more complex or more aware of the validity of the socket.
240  */
241  if (this->IsPendingDeletion() || this->sock == INVALID_SOCKET) return status;
242 
244  /* We did not receive a leave message from this client... */
245  std::string client_name = this->GetClientName();
246 
247  NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, client_name, "", STR_NETWORK_ERROR_CLIENT_CONNECTION_LOST);
248 
249  /* Inform other clients of this... strange leaving ;) */
250  for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
251  if (new_cs->status > STATUS_AUTHORIZED && this != new_cs) {
252  new_cs->SendErrorQuit(this->client_id, NETWORK_ERROR_CONNECTION_LOST);
253  }
254  }
255  }
256 
257  /* If we were transfering a map to this client, stop the savegame creation
258  * process and queue the next client to receive the map. */
259  if (this->status == STATUS_MAP) {
260  /* Ensure the saving of the game is stopped too. */
261  this->savegame->Destroy();
262  this->savegame = nullptr;
263 
264  this->CheckNextClientToSendMap(this);
265  }
266 
267  NetworkAdminClientError(this->client_id, NETWORK_ERROR_CONNECTION_LOST);
268  Debug(net, 3, "[{}] Client #{} closed connection", ServerNetworkGameSocketHandler::GetName(), this->client_id);
269 
270  /* We just lost one client :( */
271  if (this->status >= STATUS_AUTHORIZED) _network_game_info.clients_on--;
272  extern byte _network_clients_connected;
274 
275  this->SendPackets(true);
276 
277  this->DeferDeletion();
278 
280 
281  return status;
282 }
283 
289 {
290  extern byte _network_clients_connected;
291  bool accept = _network_clients_connected < MAX_CLIENTS;
292 
293  /* We can't go over the MAX_CLIENTS limit here. However, the
294  * pool must have place for all clients and ourself. */
295  static_assert(NetworkClientSocketPool::MAX_SIZE == MAX_CLIENTS + 1);
297  return accept;
298 }
299 
302 {
303  for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
304  if (cs->writable) {
305  if (cs->SendPackets() != SPS_CLOSED && cs->status == STATUS_MAP) {
306  /* This client is in the middle of a map-send, call the function for that */
307  cs->SendMap();
308  }
309  }
310  }
311 }
312 
313 static void NetworkHandleCommandQueue(NetworkClientSocket *cs);
314 
315 /***********
316  * Sending functions
317  ************/
318 
324 {
325  Debug(net, 9, "client[{}] SendClientInfo(): client_id={}", this->client_id, ci->client_id);
326 
327  if (ci->client_id != INVALID_CLIENT_ID) {
328  auto p = std::make_unique<Packet>(PACKET_SERVER_CLIENT_INFO);
329  p->Send_uint32(ci->client_id);
330  p->Send_uint8 (ci->client_playas);
331  p->Send_string(ci->client_name);
332 
333  this->SendPacket(std::move(p));
334  }
336 }
337 
340 {
341  Debug(net, 9, "client[{}] SendGameInfo()", this->client_id);
342 
343  auto p = std::make_unique<Packet>(PACKET_SERVER_GAME_INFO, TCP_MTU);
344  SerializeNetworkGameInfo(*p, GetCurrentNetworkServerGameInfo());
345 
346  this->SendPacket(std::move(p));
347 
349 }
350 
357 {
358  Debug(net, 9, "client[{}] SendError(): error={}", this->client_id, error);
359 
360  auto p = std::make_unique<Packet>(PACKET_SERVER_ERROR);
361 
362  p->Send_uint8(error);
363  if (!reason.empty()) p->Send_string(reason);
364  this->SendPacket(std::move(p));
365 
366  StringID strid = GetNetworkErrorMsg(error);
367 
368  /* Only send when the current client was in game */
369  if (this->status > STATUS_AUTHORIZED) {
370  std::string client_name = this->GetClientName();
371 
372  Debug(net, 1, "'{}' made an error and has been disconnected: {}", client_name, GetString(strid));
373 
374  if (error == NETWORK_ERROR_KICKED && !reason.empty()) {
375  NetworkTextMessage(NETWORK_ACTION_KICKED, CC_DEFAULT, false, client_name, reason, strid);
376  } else {
377  NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, client_name, "", strid);
378  }
379 
380  for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
381  if (new_cs->status >= STATUS_AUTHORIZED && new_cs != this) {
382  /* Some errors we filter to a more general error. Clients don't have to know the real
383  * reason a joining failed. */
384  if (error == NETWORK_ERROR_NOT_AUTHORIZED || error == NETWORK_ERROR_NOT_EXPECTED || error == NETWORK_ERROR_WRONG_REVISION) {
385  error = NETWORK_ERROR_ILLEGAL_PACKET;
386  }
387  new_cs->SendErrorQuit(this->client_id, error);
388  }
389  }
390 
391  NetworkAdminClientError(this->client_id, error);
392  } else {
393  Debug(net, 1, "Client {} made an error and has been disconnected: {}", this->client_id, GetString(strid));
394  }
395 
396  /* The client made a mistake, so drop the connection now! */
398 }
399 
402 {
403  Debug(net, 9, "client[{}] SendNewGRFCheck()", this->client_id);
404 
405  auto p = std::make_unique<Packet>(PACKET_SERVER_CHECK_NEWGRFS, TCP_MTU);
406  const GRFConfig *c;
407  uint grf_count = 0;
408 
409  for (c = _grfconfig; c != nullptr; c = c->next) {
410  if (!HasBit(c->flags, GCF_STATIC)) grf_count++;
411  }
412 
413  p->Send_uint8 (grf_count);
414  for (c = _grfconfig; c != nullptr; c = c->next) {
415  if (!HasBit(c->flags, GCF_STATIC)) SerializeGRFIdentifier(*p, c->ident);
416  }
417 
418  this->SendPacket(std::move(p));
420 }
421 
424 {
426  /* Do not actually need a game password, continue with the company password. */
427  return this->SendNeedCompanyPassword();
428  }
429 
430  Debug(net, 9, "client[{}] SendNeedGamePassword()", this->client_id);
431 
432  /* Invalid packet when status is STATUS_AUTH_GAME or higher */
434 
435  Debug(net, 9, "client[{}] status = AUTH_GAME", this->client_id);
436  this->status = STATUS_AUTH_GAME;
437  /* Reset 'lag' counters */
439 
440  auto p = std::make_unique<Packet>(PACKET_SERVER_NEED_GAME_PASSWORD);
441  this->SendPacket(std::move(p));
443 }
444 
447 {
448  NetworkClientInfo *ci = this->GetInfo();
450  return this->SendWelcome();
451  }
452 
453  Debug(net, 9, "client[{}] SendNeedCompanyPassword()", this->client_id);
454 
455  /* Invalid packet when status is STATUS_AUTH_COMPANY or higher */
457 
458  Debug(net, 9, "client[{}] status = AUTH_COMPANY", this->client_id);
459  this->status = STATUS_AUTH_COMPANY;
460  /* Reset 'lag' counters */
462 
463  auto p = std::make_unique<Packet>(PACKET_SERVER_NEED_COMPANY_PASSWORD);
465  p->Send_string(_settings_client.network.network_id);
466  this->SendPacket(std::move(p));
468 }
469 
472 {
473  Debug(net, 9, "client[{}] SendWelcome()", this->client_id);
474 
475  /* Invalid packet when status is AUTH or higher */
477 
478  Debug(net, 9, "client[{}] status = AUTHORIZED", this->client_id);
479  this->status = STATUS_AUTHORIZED;
480  /* Reset 'lag' counters */
482 
483  _network_game_info.clients_on++;
484 
485  auto p = std::make_unique<Packet>(PACKET_SERVER_WELCOME);
486  p->Send_uint32(this->client_id);
488  p->Send_string(_settings_client.network.network_id);
489  this->SendPacket(std::move(p));
490 
491  /* Transmit info about all the active clients */
492  for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
493  if (new_cs != this && new_cs->status >= STATUS_AUTHORIZED) {
494  this->SendClientInfo(new_cs->GetInfo());
495  }
496  }
497  /* Also send the info of the server */
499 }
500 
503 {
504  Debug(net, 9, "client[{}] SendWait()", this->client_id);
505 
506  int waiting = 1; // current player getting the map counts as 1
507 
508  /* Count how many clients are waiting in the queue, in front of you! */
509  for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
510  if (new_cs->status != STATUS_MAP_WAIT) continue;
511  if (new_cs->GetInfo()->join_date < this->GetInfo()->join_date || (new_cs->GetInfo()->join_date == this->GetInfo()->join_date && new_cs->client_id < this->client_id)) waiting++;
512  }
513 
514  auto p = std::make_unique<Packet>(PACKET_SERVER_WAIT);
515  p->Send_uint8(waiting);
516  this->SendPacket(std::move(p));
518 }
519 
520 void ServerNetworkGameSocketHandler::CheckNextClientToSendMap(NetworkClientSocket *ignore_cs)
521 {
522  Debug(net, 9, "client[{}] CheckNextClientToSendMap()", this->client_id);
523 
524  /* Find the best candidate for joining, i.e. the first joiner. */
525  NetworkClientSocket *best = nullptr;
526  for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
527  if (ignore_cs == new_cs) continue;
528 
529  if (new_cs->status == STATUS_MAP_WAIT) {
530  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)) {
531  best = new_cs;
532  }
533  }
534  }
535 
536  /* Is there someone else to join? */
537  if (best != nullptr) {
538  /* Let the first start joining. */
539  best->status = STATUS_AUTHORIZED;
540  best->SendMap();
541 
542  /* And update the rest. */
543  for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
544  if (new_cs->status == STATUS_MAP_WAIT) new_cs->SendWait();
545  }
546  }
547 }
548 
551 {
552  if (this->status < STATUS_AUTHORIZED) {
553  /* Illegal call, return error and ignore the packet */
554  return this->SendError(NETWORK_ERROR_NOT_AUTHORIZED);
555  }
556 
557  if (this->status == STATUS_AUTHORIZED) {
558  Debug(net, 9, "client[{}] SendMap(): first_packet", this->client_id);
559 
560  WaitTillSaved();
561  this->savegame = std::make_shared<PacketWriter>(this);
562 
563  /* Now send the _frame_counter and how many packets are coming */
564  auto p = std::make_unique<Packet>(PACKET_SERVER_MAP_BEGIN);
565  p->Send_uint32(_frame_counter);
566  this->SendPacket(std::move(p));
567 
569  Debug(net, 9, "client[{}] status = MAP", this->client_id);
570  this->status = STATUS_MAP;
571  /* Mark the start of download */
572  this->last_frame = _frame_counter;
574 
575  /* Make a dump of the current game */
576  if (SaveWithFilter(this->savegame, true) != SL_OK) UserError("network savedump failed");
577  }
578 
579  if (this->status == STATUS_MAP) {
580  bool last_packet = this->savegame->TransferToNetworkQueue(this);
581  if (last_packet) {
582  Debug(net, 9, "client[{}] SendMap(): last_packet", this->client_id);
583 
584  /* Done reading, make sure saving is done as well */
585  this->savegame->Destroy();
586  this->savegame = nullptr;
587 
588  /* Set the status to DONE_MAP, no we will wait for the client
589  * to send it is ready (maybe that happens like never ;)) */
590  Debug(net, 9, "client[{}] status = DONE_MAP", this->client_id);
591  this->status = STATUS_DONE_MAP;
592 
593  this->CheckNextClientToSendMap();
594  }
595  }
597 }
598 
604 {
605  Debug(net, 9, "client[{}] SendJoin(): client_id={}", this->client_id, client_id);
606 
607  auto p = std::make_unique<Packet>(PACKET_SERVER_JOIN);
608 
609  p->Send_uint32(client_id);
610 
611  this->SendPacket(std::move(p));
613 }
614 
617 {
618  auto p = std::make_unique<Packet>(PACKET_SERVER_FRAME);
619  p->Send_uint32(_frame_counter);
620  p->Send_uint32(_frame_counter_max);
621 #ifdef ENABLE_NETWORK_SYNC_EVERY_FRAME
622  p->Send_uint32(_sync_seed_1);
623 #ifdef NETWORK_SEND_DOUBLE_SEED
624  p->Send_uint32(_sync_seed_2);
625 #endif
626 #endif
627 
628  /* If token equals 0, we need to make a new token and send that. */
629  if (this->last_token == 0) {
630  this->last_token = InteractiveRandomRange(UINT8_MAX - 1) + 1;
631  p->Send_uint8(this->last_token);
632  }
633 
634  this->SendPacket(std::move(p));
636 }
637 
640 {
641  Debug(net, 9, "client[{}] SendSync(), frame_counter={}, sync_seed_1={}", this->client_id, _frame_counter, _sync_seed_1);
642 
643  auto p = std::make_unique<Packet>(PACKET_SERVER_SYNC);
644  p->Send_uint32(_frame_counter);
645  p->Send_uint32(_sync_seed_1);
646 
647 #ifdef NETWORK_SEND_DOUBLE_SEED
648  p->Send_uint32(_sync_seed_2);
649 #endif
650  this->SendPacket(std::move(p));
652 }
653 
659 {
660  Debug(net, 9, "client[{}] SendCommand(): cmd={}", this->client_id, cp.cmd);
661 
662  auto p = std::make_unique<Packet>(PACKET_SERVER_COMMAND);
663 
665  p->Send_uint32(cp.frame);
666  p->Send_bool (cp.my_cmd);
667 
668  this->SendPacket(std::move(p));
670 }
671 
680 NetworkRecvStatus ServerNetworkGameSocketHandler::SendChat(NetworkAction action, ClientID client_id, bool self_send, const std::string &msg, int64_t data)
681 {
682  Debug(net, 9, "client[{}] SendChat(): action={}, client_id={}, self_send={}", this->client_id, action, client_id, self_send);
683 
685 
686  auto p = std::make_unique<Packet>(PACKET_SERVER_CHAT);
687 
688  p->Send_uint8 (action);
689  p->Send_uint32(client_id);
690  p->Send_bool (self_send);
691  p->Send_string(msg);
692  p->Send_uint64(data);
693 
694  this->SendPacket(std::move(p));
696 }
697 
705 NetworkRecvStatus ServerNetworkGameSocketHandler::SendExternalChat(const std::string &source, TextColour colour, const std::string &user, const std::string &msg)
706 {
707  Debug(net, 9, "client[{}] SendExternalChat(): source={}", this->client_id, source);
708 
710 
711  auto p = std::make_unique<Packet>(PACKET_SERVER_EXTERNAL_CHAT);
712 
713  p->Send_string(source);
714  p->Send_uint16(colour);
715  p->Send_string(user);
716  p->Send_string(msg);
717 
718  this->SendPacket(std::move(p));
720 }
721 
728 {
729  Debug(net, 9, "client[{}] SendErrorQuit(): client_id={}, errorno={}", this->client_id, client_id, errorno);
730 
731  auto p = std::make_unique<Packet>(PACKET_SERVER_ERROR_QUIT);
732 
733  p->Send_uint32(client_id);
734  p->Send_uint8 (errorno);
735 
736  this->SendPacket(std::move(p));
738 }
739 
745 {
746  Debug(net, 9, "client[{}] SendQuit(): client_id={}", this->client_id, client_id);
747 
748  auto p = std::make_unique<Packet>(PACKET_SERVER_QUIT);
749 
750  p->Send_uint32(client_id);
751 
752  this->SendPacket(std::move(p));
754 }
755 
758 {
759  Debug(net, 9, "client[{}] SendShutdown()", this->client_id);
760 
761  auto p = std::make_unique<Packet>(PACKET_SERVER_SHUTDOWN);
762  this->SendPacket(std::move(p));
764 }
765 
768 {
769  Debug(net, 9, "client[{}] SendNewGame()", this->client_id);
770 
771  auto p = std::make_unique<Packet>(PACKET_SERVER_NEWGAME);
772  this->SendPacket(std::move(p));
774 }
775 
781 NetworkRecvStatus ServerNetworkGameSocketHandler::SendRConResult(uint16_t colour, const std::string &command)
782 {
783  Debug(net, 9, "client[{}] SendRConResult()", this->client_id);
784 
785  auto p = std::make_unique<Packet>(PACKET_SERVER_RCON);
786 
787  p->Send_uint16(colour);
788  p->Send_string(command);
789  this->SendPacket(std::move(p));
791 }
792 
799 {
800  Debug(net, 9, "client[{}] SendMove(): client_id={}", this->client_id, client_id);
801 
802  auto p = std::make_unique<Packet>(PACKET_SERVER_MOVE);
803 
804  p->Send_uint32(client_id);
805  p->Send_uint8(company_id);
806  this->SendPacket(std::move(p));
808 }
809 
812 {
813  Debug(net, 9, "client[{}] SendCompanyUpdate()", this->client_id);
814 
815  auto p = std::make_unique<Packet>(PACKET_SERVER_COMPANY_UPDATE);
816 
817  static_assert(sizeof(_network_company_passworded) <= sizeof(uint16_t));
818  p->Send_uint16(_network_company_passworded);
819  this->SendPacket(std::move(p));
821 }
822 
825 {
826  Debug(net, 9, "client[{}] SendConfigUpdate()", this->client_id);
827 
828  auto p = std::make_unique<Packet>(PACKET_SERVER_CONFIG_UPDATE);
829 
830  p->Send_uint8(_settings_client.network.max_companies);
831  p->Send_string(_settings_client.network.server_name);
832  this->SendPacket(std::move(p));
834 }
835 
836 /***********
837  * Receiving functions
838  ************/
839 
841 {
842  Debug(net, 9, "client[{}] Receive_CLIENT_GAME_INFO()", this->client_id);
843 
844  return this->SendGameInfo();
845 }
846 
848 {
849  if (this->status != STATUS_NEWGRFS_CHECK) {
850  /* Illegal call, return error and ignore the packet */
851  return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
852  }
853 
854  Debug(net, 9, "client[{}] Receive_CLIENT_NEWGRFS_CHECKED()", this->client_id);
855 
856  return this->SendNeedGamePassword();
857 }
858 
860 {
861  if (this->status != STATUS_INACTIVE) {
862  /* Illegal call, return error and ignore the packet */
863  return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
864  }
865 
866  if (_network_game_info.clients_on >= _settings_client.network.max_clients) {
867  /* Turns out we are full. Inform the user about this. */
868  return this->SendError(NETWORK_ERROR_FULL);
869  }
870 
871  std::string client_revision = p.Recv_string(NETWORK_REVISION_LENGTH);
872  uint32_t newgrf_version = p.Recv_uint32();
873 
874  Debug(net, 9, "client[{}] Receive_CLIENT_JOIN(): client_revision={}, newgrf_version={}", this->client_id, client_revision, newgrf_version);
875 
876  /* Check if the client has revision control enabled */
877  if (!IsNetworkCompatibleVersion(client_revision) || _openttd_newgrf_version != newgrf_version) {
878  /* Different revisions!! */
879  return this->SendError(NETWORK_ERROR_WRONG_REVISION);
880  }
881 
882  std::string client_name = p.Recv_string(NETWORK_CLIENT_NAME_LENGTH);
883  CompanyID playas = (Owner)p.Recv_uint8();
884 
886 
887  /* join another company does not affect these values */
888  switch (playas) {
889  case COMPANY_NEW_COMPANY: // New company
891  return this->SendError(NETWORK_ERROR_FULL);
892  }
893  break;
894  case COMPANY_SPECTATOR: // Spectator
895  break;
896  default: // Join another company (companies 1-8 (index 0-7))
897  if (!Company::IsValidHumanID(playas)) {
898  return this->SendError(NETWORK_ERROR_COMPANY_MISMATCH);
899  }
900  break;
901  }
902 
903  if (!NetworkIsValidClientName(client_name)) {
904  /* An invalid client name was given. However, the client ensures the name
905  * is valid before it is sent over the network, so something went horribly
906  * wrong. This is probably someone trying to troll us. */
907  return this->SendError(NETWORK_ERROR_INVALID_CLIENT_NAME);
908  }
909 
910  if (!NetworkMakeClientNameUnique(client_name)) { // Change name if duplicate
911  /* We could not create a name for this client */
912  return this->SendError(NETWORK_ERROR_NAME_IN_USE);
913  }
914 
917  this->SetInfo(ci);
919  ci->client_name = client_name;
920  ci->client_playas = playas;
921  Debug(desync, 1, "client: {:08x}; {:02x}; {:02x}; {:02x}", TimerGameEconomy::date, TimerGameEconomy::date_fract, (int)ci->client_playas, (int)ci->index);
922 
923  /* Make sure companies to which people try to join are not autocleaned */
925 
926  Debug(net, 9, "client[{}] status = NEWGRFS_CHECK", this->client_id);
928 
929  if (_grfconfig == nullptr) {
930  /* Continue asking for the game password. */
931  return this->SendNeedGamePassword();
932  }
933 
934  return this->SendNewGRFCheck();
935 }
936 
938 {
939  if (this->status != STATUS_AUTH_GAME) {
940  return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
941  }
942 
943  Debug(net, 9, "client[{}] Receive_CLIENT_GAME_PASSWORD()", this->client_id);
944 
945  std::string password = p.Recv_string(NETWORK_PASSWORD_LENGTH);
946 
947  /* Check game password. Allow joining if we cleared the password meanwhile */
949  _settings_client.network.server_password.compare(password) != 0) {
950  /* Password is invalid */
951  return this->SendError(NETWORK_ERROR_WRONG_PASSWORD);
952  }
953 
954  return this->SendNeedCompanyPassword();
955 }
956 
958 {
959  if (this->status != STATUS_AUTH_COMPANY) {
960  return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
961  }
962 
963  Debug(net, 9, "client[{}] Receive_CLIENT_COMPANY_PASSWORD()", this->client_id);
964 
965  std::string password = p.Recv_string(NETWORK_PASSWORD_LENGTH);
966 
967  /* Check company password. Allow joining if we cleared the password meanwhile.
968  * Also, check the company is still valid - client could be moved to spectators
969  * in the middle of the authorization process */
970  CompanyID playas = this->GetInfo()->client_playas;
971  if (Company::IsValidID(playas) && !_network_company_states[playas].password.empty() &&
972  _network_company_states[playas].password.compare(password) != 0) {
973  /* Password is invalid */
974  return this->SendError(NETWORK_ERROR_WRONG_PASSWORD);
975  }
976 
977  return this->SendWelcome();
978 }
979 
981 {
982  /* The client was never joined.. so this is impossible, right?
983  * Ignore the packet, give the client a warning, and close the connection */
984  if (this->status < STATUS_AUTHORIZED || this->HasClientQuit()) {
985  return this->SendError(NETWORK_ERROR_NOT_AUTHORIZED);
986  }
987 
988  Debug(net, 9, "client[{}] Receive_CLIENT_GETMAP()", this->client_id);
989 
990  /* Check if someone else is receiving the map */
991  for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
992  if (new_cs->status == STATUS_MAP) {
993  /* Tell the new client to wait */
994  Debug(net, 9, "client[{}] status = MAP_WAIT", this->client_id);
995  this->status = STATUS_MAP_WAIT;
996  return this->SendWait();
997  }
998  }
999 
1000  /* We receive a request to upload the map.. give it to the client! */
1001  return this->SendMap();
1002 }
1003 
1005 {
1006  /* Client has the map, now start syncing */
1007  if (this->status == STATUS_DONE_MAP && !this->HasClientQuit()) {
1008  Debug(net, 9, "client[{}] Receive_CLIENT_MAP_OK()", this->client_id);
1009 
1010  std::string client_name = this->GetClientName();
1011 
1012  NetworkTextMessage(NETWORK_ACTION_JOIN, CC_DEFAULT, false, client_name, "", this->client_id);
1014 
1015  Debug(net, 3, "[{}] Client #{} ({}) joined as {}", ServerNetworkGameSocketHandler::GetName(), this->client_id, this->GetClientIP(), client_name);
1016 
1017  /* Mark the client as pre-active, and wait for an ACK
1018  * so we know it is done loading and in sync with us */
1019  Debug(net, 9, "client[{}] status = PRE_ACTIVE", this->client_id);
1020  this->status = STATUS_PRE_ACTIVE;
1022  this->SendFrame();
1023  this->SendSync();
1024 
1025  /* This is the frame the client receives
1026  * we need it later on to make sure the client is not too slow */
1027  this->last_frame = _frame_counter;
1029 
1030  for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
1031  if (new_cs->status >= STATUS_AUTHORIZED) {
1032  new_cs->SendClientInfo(this->GetInfo());
1033  new_cs->SendJoin(this->client_id);
1034  }
1035  }
1036 
1037  NetworkAdminClientInfo(this, true);
1038 
1039  /* also update the new client with our max values */
1040  this->SendConfigUpdate();
1041 
1042  /* quickly update the syncing client with company details */
1043  return this->SendCompanyUpdate();
1044  }
1045 
1046  /* Wrong status for this packet, give a warning to client, and close connection */
1047  return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
1048 }
1049 
1055 {
1056  /* The client was never joined.. so this is impossible, right?
1057  * Ignore the packet, give the client a warning, and close the connection */
1058  if (this->status < STATUS_DONE_MAP || this->HasClientQuit()) {
1059  return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
1060  }
1061 
1063  return this->SendError(NETWORK_ERROR_TOO_MANY_COMMANDS);
1064  }
1065 
1066  Debug(net, 9, "client[{}] Receive_CLIENT_COMMAND()", this->client_id);
1067 
1068  CommandPacket cp;
1069  const char *err = this->ReceiveCommand(p, cp);
1070 
1071  if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CLIENT_QUIT;
1072 
1073  NetworkClientInfo *ci = this->GetInfo();
1074 
1075  if (err != nullptr) {
1076  IConsolePrint(CC_WARNING, "Dropping client #{} (IP: {}) due to {}.", ci->client_id, this->GetClientIP(), err);
1077  return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
1078  }
1079 
1080 
1081  if ((GetCommandFlags(cp.cmd) & CMD_SERVER) && ci->client_id != CLIENT_ID_SERVER) {
1082  IConsolePrint(CC_WARNING, "Kicking client #{} (IP: {}) due to calling a server only command {}.", ci->client_id, this->GetClientIP(), cp.cmd);
1083  return this->SendError(NETWORK_ERROR_KICKED);
1084  }
1085 
1087  IConsolePrint(CC_WARNING, "Kicking client #{} (IP: {}) due to calling a non-spectator command {}.", ci->client_id, this->GetClientIP(), cp.cmd);
1088  return this->SendError(NETWORK_ERROR_KICKED);
1089  }
1090 
1096  CompanyCtrlAction cca = cp.cmd == CMD_COMPANY_CTRL ? std::get<0>(EndianBufferReader::ToValue<CommandTraits<CMD_COMPANY_CTRL>::Args>(cp.data)) : CCA_NEW;
1097  if (!(cp.cmd == CMD_COMPANY_CTRL && cca == CCA_NEW && ci->client_playas == COMPANY_NEW_COMPANY) && ci->client_playas != cp.company) {
1098  IConsolePrint(CC_WARNING, "Kicking client #{} (IP: {}) due to calling a command as another company {}.",
1099  ci->client_playas + 1, this->GetClientIP(), cp.company + 1);
1100  return this->SendError(NETWORK_ERROR_COMPANY_MISMATCH);
1101  }
1102 
1103  if (cp.cmd == CMD_COMPANY_CTRL) {
1104  if (cca != CCA_NEW || cp.company != COMPANY_SPECTATOR) {
1105  return this->SendError(NETWORK_ERROR_CHEATER);
1106  }
1107 
1108  /* Check if we are full - else it's possible for spectators to send a CMD_COMPANY_CTRL and the company is created regardless of max_companies! */
1110  NetworkServerSendChat(NETWORK_ACTION_SERVER_MESSAGE, DESTTYPE_CLIENT, ci->client_id, "cannot create new company, server full", CLIENT_ID_SERVER);
1111  return NETWORK_RECV_STATUS_OKAY;
1112  }
1113  }
1114 
1116 
1117  this->incoming_queue.push_back(cp);
1118  return NETWORK_RECV_STATUS_OKAY;
1119 }
1120 
1122 {
1123  /* This packets means a client noticed an error and is reporting this
1124  * to us. Display the error and report it to the other clients */
1126 
1127  Debug(net, 9, "client[{}] Receive_CLIENT_ERROR(): errorno={}", this->client_id, errorno);
1128 
1129  /* The client was never joined.. thank the client for the packet, but ignore it */
1130  if (this->status < STATUS_DONE_MAP || this->HasClientQuit()) {
1132  }
1133 
1134  std::string client_name = this->GetClientName();
1135  StringID strid = GetNetworkErrorMsg(errorno);
1136 
1137  Debug(net, 1, "'{}' reported an error and is closing its connection: {}", client_name, GetString(strid));
1138 
1139  NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, client_name, "", strid);
1140 
1141  for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
1142  if (new_cs->status >= STATUS_AUTHORIZED) {
1143  new_cs->SendErrorQuit(this->client_id, errorno);
1144  }
1145  }
1146 
1147  NetworkAdminClientError(this->client_id, errorno);
1148 
1150 }
1151 
1153 {
1154  /* The client was never joined.. thank the client for the packet, but ignore it */
1155  if (this->status < STATUS_DONE_MAP || this->HasClientQuit()) {
1157  }
1158 
1159  Debug(net, 9, "client[{}] Receive_CLIENT_QUIT()", this->client_id);
1160 
1161  /* The client wants to leave. Display this and report it to the other clients. */
1162  std::string client_name = this->GetClientName();
1163  NetworkTextMessage(NETWORK_ACTION_LEAVE, CC_DEFAULT, false, client_name, "", STR_NETWORK_MESSAGE_CLIENT_LEAVING);
1164 
1165  for (NetworkClientSocket *new_cs : NetworkClientSocket::Iterate()) {
1166  if (new_cs->status >= STATUS_AUTHORIZED && new_cs != this) {
1167  new_cs->SendQuit(this->client_id);
1168  }
1169  }
1170 
1172 
1174 }
1175 
1177 {
1178  if (this->status < STATUS_AUTHORIZED) {
1179  /* Illegal call, return error and ignore the packet */
1180  return this->SendError(NETWORK_ERROR_NOT_AUTHORIZED);
1181  }
1182 
1183  uint32_t frame = p.Recv_uint32();
1184 
1185  Debug(net, 9, "client[{}] Receive_CLIENT_ACK(): frame={}", this->client_id, frame);
1186 
1187  /* The client is trying to catch up with the server */
1188  if (this->status == STATUS_PRE_ACTIVE) {
1189  /* The client is not yet caught up? */
1191 
1192  /* Now it is! Unpause the game */
1193  Debug(net, 9, "client[{}] status = ACTIVE", this->client_id);
1194  this->status = STATUS_ACTIVE;
1196 
1197  /* Execute script for, e.g. MOTD */
1198  IConsoleCmdExec("exec scripts/on_server_connect.scr 0");
1199  }
1200 
1201  /* Get, and validate the token. */
1202  uint8_t token = p.Recv_uint8();
1203  if (token == this->last_token) {
1204  /* We differentiate between last_token_frame and last_frame so the lag
1205  * test uses the actual lag of the client instead of the lag for getting
1206  * the token back and forth; after all, the token is only sent every
1207  * time we receive a PACKET_CLIENT_ACK, after which we will send a new
1208  * token to the client. If the lag would be one day, then we would not
1209  * be sending the new token soon enough for the new daily scheduled
1210  * PACKET_CLIENT_ACK. This would then register the lag of the client as
1211  * two days, even when it's only a single day. */
1213  /* Request a new token. */
1214  this->last_token = 0;
1215  }
1216 
1217  /* The client received the frame, make note of it */
1218  this->last_frame = frame;
1219  /* With those 2 values we can calculate the lag realtime */
1221  return NETWORK_RECV_STATUS_OKAY;
1222 }
1223 
1224 
1235 void NetworkServerSendChat(NetworkAction action, DestType desttype, int dest, const std::string &msg, ClientID from_id, int64_t data, bool from_admin)
1236 {
1237  const NetworkClientInfo *ci, *ci_own, *ci_to;
1238 
1239  switch (desttype) {
1240  case DESTTYPE_CLIENT:
1241  /* Are we sending to the server? */
1242  if ((ClientID)dest == CLIENT_ID_SERVER) {
1243  ci = NetworkClientInfo::GetByClientID(from_id);
1244  /* Display the text locally, and that is it */
1245  if (ci != nullptr) {
1246  NetworkTextMessage(action, GetDrawStringCompanyColour(ci->client_playas), false, ci->client_name, msg, data);
1247 
1249  NetworkAdminChat(action, desttype, from_id, msg, data, from_admin);
1250  }
1251  }
1252  } else {
1253  /* Else find the client to send the message to */
1254  for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
1255  if (cs->client_id == (ClientID)dest) {
1256  cs->SendChat(action, from_id, false, msg, data);
1257  break;
1258  }
1259  }
1260  }
1261 
1262  /* Display the message locally (so you know you have sent it) */
1263  if (from_id != (ClientID)dest) {
1264  if (from_id == CLIENT_ID_SERVER) {
1265  ci = NetworkClientInfo::GetByClientID(from_id);
1267  if (ci != nullptr && ci_to != nullptr) {
1268  NetworkTextMessage(action, GetDrawStringCompanyColour(ci->client_playas), true, ci_to->client_name, msg, data);
1269  }
1270  } else {
1271  for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
1272  if (cs->client_id == from_id) {
1273  cs->SendChat(action, (ClientID)dest, true, msg, data);
1274  break;
1275  }
1276  }
1277  }
1278  }
1279  break;
1280  case DESTTYPE_TEAM: {
1281  /* If this is false, the message is already displayed on the client who sent it. */
1282  bool show_local = true;
1283  /* Find all clients that belong to this company */
1284  ci_to = nullptr;
1285  for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
1286  ci = cs->GetInfo();
1287  if (ci != nullptr && ci->client_playas == (CompanyID)dest) {
1288  cs->SendChat(action, from_id, false, msg, data);
1289  if (cs->client_id == from_id) show_local = false;
1290  ci_to = ci; // Remember a client that is in the company for company-name
1291  }
1292  }
1293 
1294  /* if the server can read it, let the admin network read it, too. */
1296  NetworkAdminChat(action, desttype, from_id, msg, data, from_admin);
1297  }
1298 
1299  ci = NetworkClientInfo::GetByClientID(from_id);
1301  if (ci != nullptr && ci_own != nullptr && ci_own->client_playas == dest) {
1302  NetworkTextMessage(action, GetDrawStringCompanyColour(ci->client_playas), false, ci->client_name, msg, data);
1303  if (from_id == CLIENT_ID_SERVER) show_local = false;
1304  ci_to = ci_own;
1305  }
1306 
1307  /* There is no such client */
1308  if (ci_to == nullptr) break;
1309 
1310  /* Display the message locally (so you know you have sent it) */
1311  if (ci != nullptr && show_local) {
1312  if (from_id == CLIENT_ID_SERVER) {
1313  StringID str = Company::IsValidID(ci_to->client_playas) ? STR_COMPANY_NAME : STR_NETWORK_SPECTATORS;
1314  SetDParam(0, ci_to->client_playas);
1315  std::string name = GetString(str);
1316  NetworkTextMessage(action, GetDrawStringCompanyColour(ci_own->client_playas), true, name, msg, data);
1317  } else {
1318  for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
1319  if (cs->client_id == from_id) {
1320  cs->SendChat(action, ci_to->client_id, true, msg, data);
1321  }
1322  }
1323  }
1324  }
1325  break;
1326  }
1327  default:
1328  Debug(net, 1, "Received unknown chat destination type {}; doing broadcast instead", desttype);
1329  [[fallthrough]];
1330 
1331  case DESTTYPE_BROADCAST:
1332  for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
1333  cs->SendChat(action, from_id, false, msg, data);
1334  }
1335 
1336  NetworkAdminChat(action, desttype, from_id, msg, data, from_admin);
1337 
1338  ci = NetworkClientInfo::GetByClientID(from_id);
1339  if (ci != nullptr) {
1340  NetworkTextMessage(action, GetDrawStringCompanyColour(ci->client_playas), false, ci->client_name, msg, data, "");
1341  }
1342  break;
1343  }
1344 }
1345 
1353 void NetworkServerSendExternalChat(const std::string &source, TextColour colour, const std::string &user, const std::string &msg)
1354 {
1355  for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
1356  cs->SendExternalChat(source, colour, user, msg);
1357  }
1358  NetworkTextMessage(NETWORK_ACTION_EXTERNAL_CHAT, colour, false, user, msg, 0, source);
1359 }
1360 
1362 {
1363  if (this->status < STATUS_PRE_ACTIVE) {
1364  /* Illegal call, return error and ignore the packet */
1365  return this->SendError(NETWORK_ERROR_NOT_AUTHORIZED);
1366  }
1367 
1368  NetworkAction action = (NetworkAction)p.Recv_uint8();
1369  DestType desttype = (DestType)p.Recv_uint8();
1370  int dest = p.Recv_uint32();
1371 
1372  Debug(net, 9, "client[{}] Receive_CLIENT_CHAT(): action={}, desttype={}, dest={}", this->client_id, action, desttype, dest);
1373 
1374  std::string msg = p.Recv_string(NETWORK_CHAT_LENGTH);
1375  int64_t data = p.Recv_uint64();
1376 
1377  NetworkClientInfo *ci = this->GetInfo();
1378  switch (action) {
1379  case NETWORK_ACTION_CHAT:
1380  case NETWORK_ACTION_CHAT_CLIENT:
1381  case NETWORK_ACTION_CHAT_COMPANY:
1382  NetworkServerSendChat(action, desttype, dest, msg, this->client_id, data);
1383  break;
1384  default:
1385  IConsolePrint(CC_WARNING, "Kicking client #{} (IP: {}) due to unknown chact action.", ci->client_id, this->GetClientIP());
1386  return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
1387  }
1388  return NETWORK_RECV_STATUS_OKAY;
1389 }
1390 
1392 {
1393  if (this->status != STATUS_ACTIVE) {
1394  /* Illegal call, return error and ignore the packet */
1395  return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
1396  }
1397 
1398  Debug(net, 9, "client[{}] Receive_CLIENT_SET_PASSWORD()", this->client_id);
1399 
1400  std::string password = p.Recv_string(NETWORK_PASSWORD_LENGTH);
1401  const NetworkClientInfo *ci = this->GetInfo();
1402 
1404  return NETWORK_RECV_STATUS_OKAY;
1405 }
1406 
1408 {
1409  if (this->status != STATUS_ACTIVE) {
1410  /* Illegal call, return error and ignore the packet */
1411  return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
1412  }
1413 
1414  Debug(net, 9, "client[{}] Receive_CLIENT_SET_NAME()", this->client_id);
1415 
1416  NetworkClientInfo *ci;
1417 
1418  std::string client_name = p.Recv_string(NETWORK_CLIENT_NAME_LENGTH);
1419  ci = this->GetInfo();
1420 
1421  if (this->HasClientQuit()) return NETWORK_RECV_STATUS_CLIENT_QUIT;
1422 
1423  if (ci != nullptr) {
1424  if (!NetworkIsValidClientName(client_name)) {
1425  /* An invalid client name was given. However, the client ensures the name
1426  * is valid before it is sent over the network, so something went horribly
1427  * wrong. This is probably someone trying to troll us. */
1428  return this->SendError(NETWORK_ERROR_INVALID_CLIENT_NAME);
1429  }
1430 
1431  /* Display change */
1432  if (NetworkMakeClientNameUnique(client_name)) {
1433  NetworkTextMessage(NETWORK_ACTION_NAME_CHANGE, CC_DEFAULT, false, ci->client_name, client_name);
1434  ci->client_name = client_name;
1436  }
1437  }
1438  return NETWORK_RECV_STATUS_OKAY;
1439 }
1440 
1442 {
1443  if (this->status != STATUS_ACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
1444 
1446 
1447  Debug(net, 9, "client[{}] Receive_CLIENT_RCON()", this->client_id);
1448 
1449  std::string password = p.Recv_string(NETWORK_PASSWORD_LENGTH);
1450  std::string command = p.Recv_string(NETWORK_RCONCOMMAND_LENGTH);
1451 
1452  if (_settings_client.network.rcon_password.compare(password) != 0) {
1453  Debug(net, 1, "[rcon] Wrong password from client-id {}", this->client_id);
1454  return NETWORK_RECV_STATUS_OKAY;
1455  }
1456 
1457  Debug(net, 3, "[rcon] Client-id {} executed: {}", this->client_id, command);
1458 
1460  IConsoleCmdExec(command);
1462  return NETWORK_RECV_STATUS_OKAY;
1463 }
1464 
1466 {
1467  if (this->status != STATUS_ACTIVE) return this->SendError(NETWORK_ERROR_NOT_EXPECTED);
1468 
1469  CompanyID company_id = (Owner)p.Recv_uint8();
1470 
1471  Debug(net, 9, "client[{}] Receive_CLIENT_MOVE(): company_id={}", this->client_id, company_id);
1472 
1473  /* Check if the company is valid, we don't allow moving to AI companies */
1474  if (company_id != COMPANY_SPECTATOR && !Company::IsValidHumanID(company_id)) return NETWORK_RECV_STATUS_OKAY;
1475 
1476  /* Check if we require a password for this company */
1477  if (company_id != COMPANY_SPECTATOR && !_network_company_states[company_id].password.empty()) {
1478  /* we need a password from the client - should be in this packet */
1479  std::string password = p.Recv_string(NETWORK_PASSWORD_LENGTH);
1480 
1481  /* Incorrect password sent, return! */
1482  if (_network_company_states[company_id].password.compare(password) != 0) {
1483  Debug(net, 2, "Wrong password from client-id #{} for company #{}", this->client_id, company_id + 1);
1484  return NETWORK_RECV_STATUS_OKAY;
1485  }
1486  }
1487 
1488  /* if we get here we can move the client */
1489  NetworkServerDoMove(this->client_id, company_id);
1490  return NETWORK_RECV_STATUS_OKAY;
1491 }
1492 
1498 {
1499  memset(stats, 0, sizeof(*stats) * MAX_COMPANIES);
1500 
1501  /* Go through all vehicles and count the type of vehicles */
1502  for (const Vehicle *v : Vehicle::Iterate()) {
1503  if (!Company::IsValidID(v->owner) || !v->IsPrimaryVehicle()) continue;
1504  byte type = 0;
1505  switch (v->type) {
1506  case VEH_TRAIN: type = NETWORK_VEH_TRAIN; break;
1507  case VEH_ROAD: type = RoadVehicle::From(v)->IsBus() ? NETWORK_VEH_BUS : NETWORK_VEH_LORRY; break;
1508  case VEH_AIRCRAFT: type = NETWORK_VEH_PLANE; break;
1509  case VEH_SHIP: type = NETWORK_VEH_SHIP; break;
1510  default: continue;
1511  }
1512  stats[v->owner].num_vehicle[type]++;
1513  }
1514 
1515  /* Go through all stations and count the types of stations */
1516  for (const Station *s : Station::Iterate()) {
1517  if (Company::IsValidID(s->owner)) {
1518  NetworkCompanyStats *npi = &stats[s->owner];
1519 
1520  if (s->facilities & FACIL_TRAIN) npi->num_station[NETWORK_VEH_TRAIN]++;
1521  if (s->facilities & FACIL_TRUCK_STOP) npi->num_station[NETWORK_VEH_LORRY]++;
1522  if (s->facilities & FACIL_BUS_STOP) npi->num_station[NETWORK_VEH_BUS]++;
1523  if (s->facilities & FACIL_AIRPORT) npi->num_station[NETWORK_VEH_PLANE]++;
1524  if (s->facilities & FACIL_DOCK) npi->num_station[NETWORK_VEH_SHIP]++;
1525  }
1526  }
1527 }
1528 
1534 {
1536 
1537  if (ci == nullptr) return;
1538 
1539  Debug(desync, 1, "client: {:08x}; {:02x}; {:02x}; {:04x}", TimerGameEconomy::date, TimerGameEconomy::date_fract, (int)ci->client_playas, client_id);
1540 
1541  for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
1543  cs->SendClientInfo(ci);
1544  }
1545  }
1546 
1548 }
1549 
1557 {
1558  CompanyMask has_clients = 0;
1559  CompanyMask has_vehicles = 0;
1560 
1562 
1563  /* Detect the active companies */
1564  for (const NetworkClientInfo *ci : NetworkClientInfo::Iterate()) {
1565  if (Company::IsValidID(ci->client_playas)) SetBit(has_clients, ci->client_playas);
1566  }
1567 
1568  if (!_network_dedicated) {
1570  assert(ci != nullptr);
1571  if (Company::IsValidID(ci->client_playas)) SetBit(has_clients, ci->client_playas);
1572  }
1573 
1575  for (const Company *c : Company::Iterate()) {
1576  if (std::any_of(std::begin(c->group_all), std::end(c->group_all), [](const GroupStatistics &gs) { return gs.num_vehicle != 0; })) SetBit(has_vehicles, c->index);
1577  }
1578  }
1579 
1580  /* Go through all the companies */
1581  for (const Company *c : Company::Iterate()) {
1582  /* Skip the non-active once */
1583  if (c->is_ai) continue;
1584 
1585  if (!HasBit(has_clients, c->index)) {
1586  /* The company is empty for one month more */
1588 
1589  /* Is the company empty for autoclean_unprotected-months, and is there no protection? */
1591  /* Shut the company down */
1593  IConsolePrint(CC_INFO, "Auto-cleaned company #{} with no password.", c->index + 1);
1594  }
1595  /* Is the company empty for autoclean_protected-months, and there is a protection? */
1597  /* Unprotect the company */
1598  _network_company_states[c->index].password.clear();
1599  IConsolePrint(CC_INFO, "Auto-removed protection from company #{}.", c->index + 1);
1600  _network_company_states[c->index].months_empty = 0;
1601  NetworkServerUpdateCompanyPassworded(c->index, false);
1602  }
1603  /* Is the company empty for autoclean_novehicles-months, and has no vehicles? */
1605  /* Shut the company down */
1607  IConsolePrint(CC_INFO, "Auto-cleaned company #{} with no vehicles.", c->index + 1);
1608  }
1609  } else {
1610  /* It is not empty, reset the date */
1611  _network_company_states[c->index].months_empty = 0;
1612  }
1613  }
1614 }
1615 
1621 bool NetworkMakeClientNameUnique(std::string &name)
1622 {
1623  bool is_name_unique = false;
1624  std::string original_name = name;
1625 
1626  for (uint number = 1; !is_name_unique && number <= MAX_CLIENTS; number++) { // Something's really wrong when there're more names than clients
1627  is_name_unique = true;
1628  for (const NetworkClientInfo *ci : NetworkClientInfo::Iterate()) {
1629  if (ci->client_name == name) {
1630  /* Name already in use */
1631  is_name_unique = false;
1632  break;
1633  }
1634  }
1635  /* Check if it is the same as the server-name */
1637  if (ci != nullptr) {
1638  if (ci->client_name == name) is_name_unique = false; // name already in use
1639  }
1640 
1641  if (!is_name_unique) {
1642  /* Try a new name (<name> #1, <name> #2, and so on) */
1643  name = original_name + " #" + std::to_string(number);
1644 
1645  /* The constructed client name is larger than the limit,
1646  * so... bail out as no valid name can be created. */
1647  if (name.size() >= NETWORK_CLIENT_NAME_LENGTH) return false;
1648  }
1649  }
1650 
1651  return is_name_unique;
1652 }
1653 
1660 bool NetworkServerChangeClientName(ClientID client_id, const std::string &new_name)
1661 {
1662  /* Check if the name's already in use */
1664  if (ci->client_name.compare(new_name) == 0) return false;
1665  }
1666 
1668  if (ci == nullptr) return false;
1669 
1670  NetworkTextMessage(NETWORK_ACTION_NAME_CHANGE, CC_DEFAULT, true, ci->client_name, new_name);
1671 
1672  ci->client_name = new_name;
1673 
1674  NetworkUpdateClientInfo(client_id);
1675  return true;
1676 }
1677 
1684 void NetworkServerSetCompanyPassword(CompanyID company_id, const std::string &password, bool already_hashed)
1685 {
1686  if (!Company::IsValidHumanID(company_id)) return;
1687 
1688  if (already_hashed) {
1689  _network_company_states[company_id].password = password;
1690  } else {
1692  }
1693 
1694  NetworkServerUpdateCompanyPassworded(company_id, !_network_company_states[company_id].password.empty());
1695 }
1696 
1701 static void NetworkHandleCommandQueue(NetworkClientSocket *cs)
1702 {
1703  for (auto &cp : cs->outgoing_queue) cs->SendCommand(cp);
1704  cs->outgoing_queue.clear();
1705 }
1706 
1711 void NetworkServer_Tick(bool send_frame)
1712 {
1713 #ifndef ENABLE_NETWORK_SYNC_EVERY_FRAME
1714  bool send_sync = false;
1715 #endif
1716 
1717 #ifndef ENABLE_NETWORK_SYNC_EVERY_FRAME
1720  send_sync = true;
1721  }
1722 #endif
1723 
1724  /* Now we are done with the frame, inform the clients that they can
1725  * do their frame! */
1726  for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
1727  /* We allow a number of bytes per frame, but only to the burst amount
1728  * to be available for packet receiving at any particular time. */
1729  cs->receive_limit = std::min<size_t>(cs->receive_limit + _settings_client.network.bytes_per_frame,
1731 
1732  /* Check if the speed of the client is what we can expect from a client */
1733  uint lag = NetworkCalculateLag(cs);
1734  switch (cs->status) {
1735  case NetworkClientSocket::STATUS_ACTIVE:
1737  /* Client did still not report in within the specified limit. */
1738 
1739  if (cs->last_packet + std::chrono::milliseconds(lag * MILLISECONDS_PER_TICK) > std::chrono::steady_clock::now()) {
1740  /* A packet was received in the last three game days, so the client is likely lagging behind. */
1741  IConsolePrint(CC_WARNING, "Client #{} (IP: {}) is dropped because the client's game state is more than {} ticks behind.", cs->client_id, cs->GetClientIP(), lag);
1742  } else {
1743  /* No packet was received in the last three game days; sounds like a lost connection. */
1744  IConsolePrint(CC_WARNING, "Client #{} (IP: {}) is dropped because the client did not respond for more than {} ticks.", cs->client_id, cs->GetClientIP(), lag);
1745  }
1746  cs->SendError(NETWORK_ERROR_TIMEOUT_COMPUTER);
1747  continue;
1748  }
1749 
1750  /* Report once per time we detect the lag, and only when we
1751  * received a packet in the last 2 seconds. If we
1752  * did not receive a packet, then the client is not just
1753  * slow, but the connection is likely severed. Mentioning
1754  * frame_freq is not useful in this case. */
1755  if (lag > (uint)Ticks::DAY_TICKS && cs->lag_test == 0 && cs->last_packet + std::chrono::seconds(2) > std::chrono::steady_clock::now()) {
1756  IConsolePrint(CC_WARNING, "[{}] Client #{} is slow, try increasing [network.]frame_freq to a higher value!", _frame_counter, cs->client_id);
1757  cs->lag_test = 1;
1758  }
1759 
1760  if (cs->last_frame_server - cs->last_token_frame >= _settings_client.network.max_lag_time) {
1761  /* This is a bad client! It didn't send the right token back within time. */
1762  IConsolePrint(CC_WARNING, "Client #{} (IP: {}) is dropped because it fails to send valid acks.", cs->client_id, cs->GetClientIP());
1763  cs->SendError(NETWORK_ERROR_TIMEOUT_COMPUTER);
1764  continue;
1765  }
1766  break;
1767 
1768  case NetworkClientSocket::STATUS_INACTIVE:
1769  case NetworkClientSocket::STATUS_NEWGRFS_CHECK:
1770  case NetworkClientSocket::STATUS_AUTHORIZED:
1771  /* NewGRF check and authorized states should be handled almost instantly.
1772  * So give them some lee-way, likewise for the query with inactive. */
1774  IConsolePrint(CC_WARNING, "Client #{} (IP: {}) is dropped because it took longer than {} ticks to start the joining process.", cs->client_id, cs->GetClientIP(), _settings_client.network.max_init_time);
1775  cs->SendError(NETWORK_ERROR_TIMEOUT_COMPUTER);
1776  continue;
1777  }
1778  break;
1779 
1780  case NetworkClientSocket::STATUS_MAP_WAIT:
1781  /* Send every two seconds a packet to the client, to make sure
1782  * it knows the server is still there; just someone else is
1783  * still receiving the map. */
1784  if (std::chrono::steady_clock::now() > cs->last_packet + std::chrono::seconds(2)) {
1785  cs->SendWait();
1786  /* We need to reset the timer, as otherwise we will be
1787  * spamming the client. Strictly speaking this variable
1788  * tracks when we last received a packet from the client,
1789  * but as it is waiting, it will not send us any till we
1790  * start sending them data. */
1791  cs->last_packet = std::chrono::steady_clock::now();
1792  }
1793  break;
1794 
1795  case NetworkClientSocket::STATUS_MAP:
1796  /* Downloading the map... this is the amount of time since starting the saving. */
1798  IConsolePrint(CC_WARNING, "Client #{} (IP: {}) is dropped because it took longer than {} ticks to download the map.", cs->client_id, cs->GetClientIP(), _settings_client.network.max_download_time);
1799  cs->SendError(NETWORK_ERROR_TIMEOUT_MAP);
1800  continue;
1801  }
1802  break;
1803 
1804  case NetworkClientSocket::STATUS_DONE_MAP:
1805  case NetworkClientSocket::STATUS_PRE_ACTIVE:
1806  /* The map has been sent, so this is for loading the map and syncing up. */
1808  IConsolePrint(CC_WARNING, "Client #{} (IP: {}) is dropped because it took longer than {} ticks to join.", cs->client_id, cs->GetClientIP(), _settings_client.network.max_join_time);
1809  cs->SendError(NETWORK_ERROR_TIMEOUT_JOIN);
1810  continue;
1811  }
1812  break;
1813 
1814  case NetworkClientSocket::STATUS_AUTH_GAME:
1815  case NetworkClientSocket::STATUS_AUTH_COMPANY:
1816  /* These don't block? */
1818  IConsolePrint(CC_WARNING, "Client #{} (IP: {}) is dropped because it took longer than {} ticks to enter the password.", cs->client_id, cs->GetClientIP(), _settings_client.network.max_password_time);
1819  cs->SendError(NETWORK_ERROR_TIMEOUT_PASSWORD);
1820  continue;
1821  }
1822  break;
1823 
1824  case NetworkClientSocket::STATUS_END:
1825  /* Bad server/code. */
1826  NOT_REACHED();
1827  }
1828 
1829  if (cs->status >= NetworkClientSocket::STATUS_PRE_ACTIVE) {
1830  /* Check if we can send command, and if we have anything in the queue */
1832 
1833  /* Send an updated _frame_counter_max to the client */
1834  if (send_frame) cs->SendFrame();
1835 
1836 #ifndef ENABLE_NETWORK_SYNC_EVERY_FRAME
1837  /* Send a sync-check packet */
1838  if (send_sync) cs->SendSync();
1839 #endif
1840  }
1841  }
1842 }
1843 
1845 static void NetworkRestartMap()
1846 {
1849  case FT_SAVEGAME:
1850  case FT_SCENARIO:
1852  break;
1853 
1854  case FT_HEIGHTMAP:
1856  break;
1857 
1858  default:
1860  }
1861 }
1862 
1865 {
1866  if (!_network_server) return;
1867 
1868  /* If setting is 0, this feature is disabled. */
1869  if (_settings_client.network.restart_hours == 0) return;
1870 
1871  Debug(net, 3, "Auto-restarting map: {} hours played", _settings_client.network.restart_hours);
1873 });
1874 
1880 {
1881  if (!_network_server) return;
1882 
1884 }
1885 
1888 {
1889  /* If setting is 0, this feature is disabled. */
1890  if (_settings_client.network.restart_game_year == 0) return;
1891 
1893  Debug(net, 3, "Auto-restarting map: year {} reached", TimerGameCalendar::year);
1895  }
1896 }
1897 
1899 static IntervalTimer<TimerGameCalendar> _calendar_network_yearly({ TimerGameCalendar::YEAR, TimerGameCalendar::Priority::NONE }, [](auto) {
1900  if (!_network_server) return;
1901 
1903 });
1904 
1906 static IntervalTimer<TimerGameEconomy> _economy_network_yearly({TimerGameEconomy::YEAR, TimerGameEconomy::Priority::NONE}, [](auto)
1907 {
1908  if (!_network_server) return;
1909 
1911 });
1912 
1914 static IntervalTimer<TimerGameEconomy> _network_quarterly({TimerGameEconomy::QUARTER, TimerGameEconomy::Priority::NONE}, [](auto)
1915 {
1916  if (!_network_server) return;
1917 
1920 });
1921 
1923 static IntervalTimer<TimerGameEconomy> _network_monthly({TimerGameEconomy::MONTH, TimerGameEconomy::Priority::NONE}, [](auto)
1924 {
1925  if (!_network_server) return;
1926 
1929 });
1930 
1932 static IntervalTimer<TimerGameEconomy> _network_weekly({TimerGameEconomy::WEEK, TimerGameEconomy::Priority::NONE}, [](auto)
1933 {
1934  if (!_network_server) return;
1935 
1937 });
1938 
1940 static IntervalTimer<TimerGameEconomy> _economy_network_daily({TimerGameEconomy::DAY, TimerGameEconomy::Priority::NONE}, [](auto)
1941 {
1942  if (!_network_server) return;
1943 
1945 });
1946 
1952 {
1953  return this->client_address.GetHostname();
1954 }
1955 
1958 {
1959  static const char * const stat_str[] = {
1960  "inactive",
1961  "checking NewGRFs",
1962  "authorizing (server password)",
1963  "authorizing (company password)",
1964  "authorized",
1965  "waiting",
1966  "loading map",
1967  "map done",
1968  "ready",
1969  "active"
1970  };
1971  static_assert(lengthof(stat_str) == NetworkClientSocket::STATUS_END);
1972 
1973  for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
1974  NetworkClientInfo *ci = cs->GetInfo();
1975  if (ci == nullptr) continue;
1976  uint lag = NetworkCalculateLag(cs);
1977  const char *status;
1978 
1979  status = (cs->status < (ptrdiff_t)lengthof(stat_str) ? stat_str[cs->status] : "unknown");
1980  IConsolePrint(CC_INFO, "Client #{} name: '{}' status: '{}' frame-lag: {} company: {} IP: {}",
1981  cs->client_id, ci->client_name, status, lag,
1982  ci->client_playas + (Company::IsValidID(ci->client_playas) ? 1 : 0),
1983  cs->GetClientIP());
1984  }
1985 }
1986 
1991 {
1992  for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
1993  if (cs->status >= NetworkClientSocket::STATUS_PRE_ACTIVE) cs->SendConfigUpdate();
1994  }
1995 }
1996 
1999 {
2000  if (_network_server) FillStaticNetworkServerGameInfo();
2001 }
2002 
2008 void NetworkServerUpdateCompanyPassworded(CompanyID company_id, bool passworded)
2009 {
2010  if (NetworkCompanyIsPassworded(company_id) == passworded) return;
2011 
2012  SB(_network_company_passworded, company_id, 1, !!passworded);
2014 
2015  for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
2016  if (cs->status >= NetworkClientSocket::STATUS_PRE_ACTIVE) cs->SendCompanyUpdate();
2017  }
2018 
2020 }
2021 
2028 void NetworkServerDoMove(ClientID client_id, CompanyID company_id)
2029 {
2030  /* Only allow non-dedicated servers and normal clients to be moved */
2031  if (client_id == CLIENT_ID_SERVER && _network_dedicated) return;
2032 
2034  assert(ci != nullptr);
2035 
2036  /* No need to waste network resources if the client is in the company already! */
2037  if (ci->client_playas == company_id) return;
2038 
2039  ci->client_playas = company_id;
2040 
2041  if (client_id == CLIENT_ID_SERVER) {
2042  SetLocalCompany(company_id);
2043  } else {
2044  NetworkClientSocket *cs = NetworkClientSocket::GetByClientID(client_id);
2045  /* When the company isn't authorized we can't move them yet. */
2046  if (cs->status < NetworkClientSocket::STATUS_AUTHORIZED) return;
2047  cs->SendMove(client_id, company_id);
2048  }
2049 
2050  /* announce the client's move */
2051  NetworkUpdateClientInfo(client_id);
2052 
2053  NetworkAction action = (company_id == COMPANY_SPECTATOR) ? NETWORK_ACTION_COMPANY_SPECTATOR : NETWORK_ACTION_COMPANY_JOIN;
2054  NetworkServerSendChat(action, DESTTYPE_BROADCAST, 0, "", client_id, company_id + 1);
2055 
2057 }
2058 
2065 void NetworkServerSendRcon(ClientID client_id, TextColour colour_code, const std::string &string)
2066 {
2067  NetworkClientSocket::GetByClientID(client_id)->SendRConResult(colour_code, string);
2068 }
2069 
2075 void NetworkServerKickClient(ClientID client_id, const std::string &reason)
2076 {
2077  if (client_id == CLIENT_ID_SERVER) return;
2078  NetworkClientSocket::GetByClientID(client_id)->SendError(NETWORK_ERROR_KICKED, reason);
2079 }
2080 
2087 uint NetworkServerKickOrBanIP(ClientID client_id, bool ban, const std::string &reason)
2088 {
2089  return NetworkServerKickOrBanIP(NetworkClientSocket::GetByClientID(client_id)->GetClientIP(), ban, reason);
2090 }
2091 
2098 uint NetworkServerKickOrBanIP(const std::string &ip, bool ban, const std::string &reason)
2099 {
2100  /* Add address to ban-list */
2101  if (ban) {
2102  bool contains = false;
2103  for (const auto &iter : _network_ban_list) {
2104  if (iter == ip) {
2105  contains = true;
2106  break;
2107  }
2108  }
2109  if (!contains) _network_ban_list.emplace_back(ip);
2110  }
2111 
2112  uint n = 0;
2113 
2114  /* There can be multiple clients with the same IP, kick them all but don't kill the server,
2115  * or the client doing the rcon. The latter can't be kicked because kicking frees closes
2116  * and subsequently free the connection related instances, which we would be reading from
2117  * and writing to after returning. So we would read or write data from freed memory up till
2118  * the segfault triggers. */
2119  for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) {
2120  if (cs->client_id == CLIENT_ID_SERVER) continue;
2121  if (cs->client_id == _redirect_console_to_client) continue;
2122  if (cs->client_address.IsInNetmask(ip)) {
2123  NetworkServerKickClient(cs->client_id, reason);
2124  n++;
2125  }
2126  }
2127 
2128  return n;
2129 }
2130 
2137 {
2138  for (const NetworkClientInfo *ci : NetworkClientInfo::Iterate()) {
2139  if (ci->client_playas == company) return true;
2140  }
2141  return false;
2142 }
2143 
2144 
2151 {
2152  const NetworkClientInfo *ci = this->GetInfo();
2153  if (ci != nullptr && !ci->client_name.empty()) return ci->client_name;
2154 
2155  return fmt::format("Client #{}", this->client_id);
2156 }
2157 
2162 {
2164  if (_network_server) {
2165  IConsolePrint(CC_INFO, "Client #{} name: '{}' company: {} IP: {}",
2166  ci->client_id,
2167  ci->client_name,
2168  ci->client_playas + (Company::IsValidID(ci->client_playas) ? 1 : 0),
2169  ci->client_id == CLIENT_ID_SERVER ? "server" : NetworkClientSocket::GetByClientID(ci->client_id)->GetClientIP());
2170  } else {
2171  IConsolePrint(CC_INFO, "Client #{} name: '{}' company: {}",
2172  ci->client_id,
2173  ci->client_name,
2174  ci->client_playas + (Company::IsValidID(ci->client_playas) ? 1 : 0));
2175  }
2176  }
2177 }
2178 
2185 {
2186  assert(c != nullptr);
2187 
2188  if (!_network_server) return;
2189 
2193 
2194  if (ci != nullptr) {
2195  /* ci is nullptr when replaying, or for AIs. In neither case there is a client. */
2196  ci->client_playas = c->index;
2199  }
2200 
2201  if (ci != nullptr) {
2202  /* ci is nullptr when replaying, or for AIs. In neither case there is a client.
2203  We need to send Admin port update here so that they first know about the new company
2204  and then learn about a possibly joining client (see FS#6025) */
2205  NetworkServerSendChat(NETWORK_ACTION_COMPANY_NEW, DESTTYPE_BROADCAST, 0, "", ci->client_id, c->index + 1);
2206  }
2207 }
VEH_AIRCRAFT
@ VEH_AIRCRAFT
Aircraft vehicle type.
Definition: vehicle_type.h:27
NetworkServerKickOrBanIP
uint NetworkServerKickOrBanIP(ClientID client_id, bool ban, const std::string &reason)
Ban, or kick, everyone joined from the given client's IP.
Definition: network_server.cpp:2087
Packet::Recv_uint64
uint64_t Recv_uint64()
Read a 64 bits integer from the packet.
Definition: packet.cpp:338
NetworkGameSocketHandler::ReceiveCommand
const char * ReceiveCommand(Packet &p, CommandPacket &cp)
Receives a command from the network.
Definition: network_command.cpp:363
NetworkCompanyStats::num_station
uint16_t num_station[NETWORK_VEH_END]
How many stations are there of this type?
Definition: network_type.h:69
NetworkCompanyStats
Simple calculated statistics of a company.
Definition: network_type.h:67
CC_INFO
static const TextColour CC_INFO
Colour for information lines.
Definition: console_type.h:27
_network_quarterly
static IntervalTimer< TimerGameEconomy > _network_quarterly({TimerGameEconomy::QUARTER, TimerGameEconomy::Priority::NONE}, [](auto) { if(!_network_server) return;NetworkAutoCleanCompanies();NetworkAdminUpdate(ADMIN_FREQUENCY_QUARTERLY);})
Quarterly "callback".
InvalidateWindowData
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-...
Definition: window.cpp:3204
PACKET_SERVER_MAP_DONE
@ PACKET_SERVER_MAP_DONE
Server tells it has just sent the last bits of the map to the client.
Definition: tcp_game.h:79
NETWORK_RECV_STATUS_CLIENT_QUIT
@ NETWORK_RECV_STATUS_CLIENT_QUIT
The connection is lost gracefully. Other clients are already informed of this leaving client.
Definition: core.h:27
SetBit
constexpr T SetBit(T &x, const uint8_t y)
Set a bit in a variable.
Definition: bitmath_func.hpp:121
FT_SCENARIO
@ FT_SCENARIO
old or new scenario
Definition: fileio_type.h:19
PACKET_SERVER_QUIT
@ PACKET_SERVER_QUIT
A server tells that a client has quit.
Definition: tcp_game.h:124
PACKET_SERVER_RCON
@ PACKET_SERVER_RCON
Response of the executed command on the server.
Definition: tcp_game.h:106
NetworkServerSendConfigUpdate
void NetworkServerSendConfigUpdate()
Send Config Update.
Definition: network_server.cpp:1990
NetworkAdminUpdate
void NetworkAdminUpdate(AdminUpdateFrequency freq)
Send (push) updates to the admin network as they have registered for these updates.
Definition: network_admin.cpp:984
NetworkTCPSocketHandler::SendPacket
virtual void SendPacket(std::unique_ptr< Packet > &&packet)
This function puts the packet in the send-queue and it is send as soon as possible.
Definition: tcp.cpp:68
SM_START_HEIGHTMAP
@ SM_START_HEIGHTMAP
Load a heightmap and start a new game from it.
Definition: openttd.h:38
ServerNetworkGameSocketHandler::SendCommand
NetworkRecvStatus SendCommand(const CommandPacket &cp)
Send a command to the client to execute.
Definition: network_server.cpp:658
NetworkSettings::max_commands_in_queue
uint16_t max_commands_in_queue
how many commands may there be in the incoming queue before dropping the connection?
Definition: settings_type.h:299
SM_LOAD_GAME
@ SM_LOAD_GAME
Load game, Play Scenario.
Definition: openttd.h:32
NetworkAdminChat
void NetworkAdminChat(NetworkAction action, DestType desttype, ClientID client_id, const std::string &msg, int64_t data, bool from_admin)
Send chat to the admin network (if they did opt in for the respective update).
Definition: network_admin.cpp:905
NetworkSettings::restart_game_year
TimerGameCalendar::Year restart_game_year
year the server restarts
Definition: settings_type.h:328
Pool::PoolItem<&_company_pool >::GetIfValid
static Titem * GetIfValid(size_t index)
Returns Titem with given index.
Definition: pool_type.hpp:350
TimerGameRealtime::UNPAUSED
@ UNPAUSED
Only run when not paused.
Definition: timer_game_realtime.h:32
NetworkServerShowStatusToConsole
void NetworkServerShowStatusToConsole()
Show the status message of all clients on the console.
Definition: network_server.cpp:1957
NetworkClientInfo::client_name
std::string client_name
Name of the client.
Definition: network_base.h:26
PACKET_SERVER_FULL
@ PACKET_SERVER_FULL
The server is full and has no place for you.
Definition: tcp_game.h:34
PacketWriter::cs
ServerNetworkGameSocketHandler * cs
Socket we are associated with.
Definition: network_server.cpp:63
NetworkCompanyState::months_empty
uint16_t months_empty
How many months the company is empty.
Definition: network_type.h:76
ServerNetworkGameSocketHandler::SendGameInfo
NetworkRecvStatus SendGameInfo()
Send the client information about the server.
Definition: network_server.cpp:339
CommandPacket::frame
uint32_t frame
the frame in which this packet is executed
Definition: network_internal.h:112
lock
std::mutex lock
synchronization for playback status fields
Definition: win32_m.cpp:35
NetworkClientInfo::client_playas
CompanyID client_playas
As which company is this client playing (CompanyID)
Definition: network_base.h:27
NetworkSettings::max_password_time
uint16_t max_password_time
maximum amount of time, in game ticks, a client may take to enter the password
Definition: settings_type.h:305
FACIL_TRUCK_STOP
@ FACIL_TRUCK_STOP
Station with truck stops.
Definition: station_type.h:53
ServerNetworkGameSocketHandler::STATUS_PRE_ACTIVE
@ STATUS_PRE_ACTIVE
The client is catching up the delayed frames.
Definition: network_server.h:60
Station
Station data structure.
Definition: station_base.h:442
ServerNetworkGameSocketHandler::Receive_CLIENT_SET_NAME
NetworkRecvStatus Receive_CLIENT_SET_NAME(Packet &p) override
Gives the client a new name: string New name of the client.
Definition: network_server.cpp:1407
GetCommandFlags
CommandFlags GetCommandFlags(Commands cmd)
This function mask the parameter with CMD_ID_MASK and returns the flags which belongs to the given co...
Definition: command.cpp:118
StringID
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
Definition: strings_type.h:16
NetworkSettings::sync_freq
uint16_t sync_freq
how often do we check whether we are still in-sync
Definition: settings_type.h:295
_network_server
bool _network_server
network-server is active
Definition: network.cpp:60
PACKET_SERVER_MOVE
@ PACKET_SERVER_MOVE
Server tells everyone that someone is moved to another company.
Definition: tcp_game.h:110
_network_company_passworded
CompanyMask _network_company_passworded
Bitmask of the password status of all companies.
Definition: network.cpp:82
NetworkAction
NetworkAction
Actions that can be used for NetworkTextMessage.
Definition: network_type.h:102
CMD_COMPANY_CTRL
@ CMD_COMPANY_CTRL
used in multiplayer to create a new companies etc.
Definition: command_type.h:296
SPS_CLOSED
@ SPS_CLOSED
The connection got closed.
Definition: tcp.h:24
NetworkGameSocketHandler::last_packet
std::chrono::steady_clock::time_point last_packet
Time we received the last frame.
Definition: tcp_game.h:501
WC_CLIENT_LIST
@ WC_CLIENT_LIST
Client list; Window numbers:
Definition: window_type.h:478
IntervalTimer
An interval timer will fire every interval, and will continue to fire until it is deleted.
Definition: timer.h:76
Pool::PoolItem::index
Tindex index
Index of this pool item.
Definition: pool_type.hpp:238
NetworkGameSocketHandler::SetInfo
void SetInfo(NetworkClientInfo *info)
Sets the client info for this socket handler.
Definition: tcp_game.h:516
ServerNetworkGameSocketHandler::Receive_CLIENT_COMMAND
NetworkRecvStatus Receive_CLIENT_COMMAND(Packet &p) override
The client has done a command and wants us to handle it.
Definition: network_server.cpp:1054
NETWORK_CHAT_LENGTH
static const uint NETWORK_CHAT_LENGTH
The maximum length of a chat message, in bytes including '\0'.
Definition: config.h:63
ServerNetworkGameSocketHandler::Receive_CLIENT_GAME_PASSWORD
NetworkRecvStatus Receive_CLIENT_GAME_PASSWORD(Packet &p) override
Send a password to the server to authorize: uint8_t Password type (see NetworkPasswordType).
Definition: network_server.cpp:937
ChangeNetworkRestartTime
void ChangeNetworkRestartTime(bool reset)
Reset the automatic network restart time interval.
Definition: network_server.cpp:1879
ServerNetworkGameSocketHandler::Receive_CLIENT_COMPANY_PASSWORD
NetworkRecvStatus Receive_CLIENT_COMPANY_PASSWORD(Packet &p) override
Send a password to the server to authorize uint8_t Password type (see NetworkPasswordType).
Definition: network_server.cpp:957
NetworkAutoCleanCompanies
static void NetworkAutoCleanCompanies()
Check if the server has autoclean_companies activated Two things happen: 1) If a company is not prote...
Definition: network_server.cpp:1556
ADMIN_FREQUENCY_DAILY
@ ADMIN_FREQUENCY_DAILY
The admin gets information about this on a daily basis.
Definition: tcp_admin.h:93
NetworkPrintClients
void NetworkPrintClients()
Print all the clients to the console.
Definition: network_server.cpp:2161
NetworkCheckRestartMapYear
static void NetworkCheckRestartMapYear()
Check if we want to restart the map based on the year.
Definition: network_server.cpp:1887
SetLocalCompany
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...
Definition: company_cmd.cpp:115
NetworkTCPSocketHandler::sock
SOCKET sock
The socket currently connected to.
Definition: tcp.h:38
ServerNetworkGameSocketHandler::receive_limit
size_t receive_limit
Amount of bytes that we can receive at this moment.
Definition: network_server.h:70
PacketWriter::Write
void Write(byte *buf, size_t size) override
Write a given number of bytes into the savegame.
Definition: network_server.cpp:140
MAX_CLIENTS
static const uint MAX_CLIENTS
How many clients can we have.
Definition: network_type.h:16
ServerNetworkGameSocketHandler::GetName
static const char * GetName()
Get the name used by the listener.
Definition: network_server.h:112
PACKET_SERVER_NEWGAME
@ PACKET_SERVER_NEWGAME
The server is preparing to start a new game.
Definition: tcp_game.h:119
PACKET_SERVER_SHUTDOWN
@ PACKET_SERVER_SHUTDOWN
The server is shutting down.
Definition: tcp_game.h:120
TextColour
TextColour
Colour of the strings, see _string_colourmap in table/string_colours.h or docs/ottd-colourtext-palett...
Definition: gfx_type.h:253
TimerGameEconomy::date_fract
static DateFract date_fract
Fractional part of the day.
Definition: timer_game_economy.h:38
GRFConfig::ident
GRFIdentifier ident
grfid and md5sum to uniquely identify newgrfs
Definition: newgrf_config.h:154
NetworkSettings::autoclean_protected
uint8_t autoclean_protected
remove the password from passworded companies after this many months
Definition: settings_type.h:324
_settings_client
ClientSettings _settings_client
The current settings for this game.
Definition: settings.cpp:54
ServerNetworkGameSocketHandler::STATUS_MAP
@ STATUS_MAP
The client is downloading the map.
Definition: network_server.h:58
Company::IsValidHumanID
static bool IsValidHumanID(size_t index)
Is this company a valid company, not controlled by a NoAI program?
Definition: company_base.h:166
NetworkSyncCommandQueue
void NetworkSyncCommandQueue(NetworkClientSocket *cs)
Sync our local command queue to the command queue of the given socket.
Definition: network_command.cpp:234
ADMIN_FREQUENCY_MONTHLY
@ ADMIN_FREQUENCY_MONTHLY
The admin gets information about this on a monthly basis.
Definition: tcp_admin.h:95
ServerNetworkGameSocketHandler::STATUS_MAP_WAIT
@ STATUS_MAP_WAIT
The client is waiting as someone else is downloading the map.
Definition: network_server.h:57
PACKET_SERVER_CLIENT_INFO
@ PACKET_SERVER_CLIENT_INFO
Server sends you information about a client.
Definition: tcp_game.h:71
WC_COMPANY
@ WC_COMPANY
Company view; Window numbers:
Definition: window_type.h:369
SocketList
std::map< SOCKET, NetworkAddress > SocketList
Type for a mapping between address and socket.
Definition: address.h:21
GetNetworkErrorMsg
StringID GetNetworkErrorMsg(NetworkErrorCode err)
Retrieve the string id of an internal error number.
Definition: network.cpp:298
PACKET_SERVER_CHECK_NEWGRFS
@ PACKET_SERVER_CHECK_NEWGRFS
Server sends NewGRF IDs and MD5 checksums for the client to check.
Definition: tcp_game.h:60
_economy_network_daily
static IntervalTimer< TimerGameEconomy > _economy_network_daily({TimerGameEconomy::DAY, TimerGameEconomy::Priority::NONE}, [](auto) { if(!_network_server) return;NetworkAdminUpdate(ADMIN_FREQUENCY_DAILY);})
Daily "callback".
PACKET_SERVER_FRAME
@ PACKET_SERVER_FRAME
Server tells the client what frame it is in, and thus to where the client may progress.
Definition: tcp_game.h:91
VEH_ROAD
@ VEH_ROAD
Road vehicle type.
Definition: vehicle_type.h:25
Vehicle
Vehicle data structure.
Definition: vehicle_base.h:240
_redirect_console_to_client
ClientID _redirect_console_to_client
If not invalid, redirect the console output to a client.
Definition: network.cpp:66
NETWORK_CLIENT_NAME_LENGTH
static const uint NETWORK_CLIENT_NAME_LENGTH
The maximum length of a client's name, in bytes including '\0'.
Definition: config.h:60
Owner
Owner
Enum for all companies/owners.
Definition: company_type.h:18
NetworkGameSocketHandler
Base socket handler for all TCP sockets.
Definition: tcp_game.h:142
PACKET_SERVER_SYNC
@ PACKET_SERVER_SYNC
Server tells the client what the random state should be.
Definition: tcp_game.h:93
NetworkAdminClientQuit
void NetworkAdminClientQuit(ClientID client_id)
Notify the admin network that a client quit (if they have opt in for the respective update).
Definition: network_admin.cpp:832
CommandTraits
Defines the traits of a command.
Definition: command_type.h:448
NetworkSettings::max_download_time
uint16_t max_download_time
maximum amount of time, in game ticks, a client may take to download the map
Definition: settings_type.h:304
CC_DEFAULT
static const TextColour CC_DEFAULT
Default colour of the console.
Definition: console_type.h:23
NetworkReplaceCommandClientId
static void NetworkReplaceCommandClientId(CommandPacket &cp, ClientID client_id)
Insert a client ID into the command data in a command packet.
Definition: network_command.cpp:416
NetworkServerSendRcon
void NetworkServerSendRcon(ClientID client_id, TextColour colour_code, const std::string &string)
Send an rcon reply to the client.
Definition: network_server.cpp:2065
PacketWriter::packets
std::deque< std::unique_ptr< Packet > > packets
Packet queue of the savegame; send these "slowly" to the client. Cannot be a std::queue as we want to...
Definition: network_server.cpp:66
ServerNetworkGameSocketHandler::STATUS_ACTIVE
@ STATUS_ACTIVE
The client is active within in the game.
Definition: network_server.h:61
NetworkServer_Tick
void NetworkServer_Tick(bool send_frame)
This is called every tick if this is a _network_server.
Definition: network_server.cpp:1711
Debug
#define Debug(category, level, format_string,...)
Ouptut a line of debugging information.
Definition: debug.h:37
network_base.h
NetworkAdminClientInfo
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).
Definition: network_admin.cpp:803
GameSettings::game_creation
GameCreationSettings game_creation
settings used during the creation of a game (map)
Definition: settings_type.h:618
PACKET_SERVER_BANNED
@ PACKET_SERVER_BANNED
The server has banned you.
Definition: tcp_game.h:35
PacketWriter::Finish
void Finish() override
Prepare everything to finish writing the savegame.
Definition: network_server.cpp:163
SpecializedStation< Station, false >::Iterate
static Pool::IterateWrapper< Station > Iterate(size_t from=0)
Returns an iterable ensemble of all valid stations of type T.
Definition: base_station_base.h:310
OrderBackup::ResetUser
static void ResetUser(uint32_t user)
Reset an user's OrderBackup if needed.
Definition: order_backup.cpp:168
Packet::Recv_string
std::string Recv_string(size_t length, StringValidationSettings settings=SVS_REPLACE_WITH_QUESTION_MARK)
Reads characters (bytes) from the packet until it finds a '\0', or reaches a maximum of length charac...
Definition: packet.cpp:383
ServerNetworkGameSocketHandler::Receive_CLIENT_GETMAP
NetworkRecvStatus Receive_CLIENT_GETMAP(Packet &p) override
Request the map from the server.
Definition: network_server.cpp:980
NetworkSettings::max_join_time
uint16_t max_join_time
maximum amount of time, in game ticks, a client may take to sync up during joining
Definition: settings_type.h:303
NetworkMakeClientNameUnique
bool NetworkMakeClientNameUnique(std::string &name)
Check whether a name is unique, and otherwise try to make it unique.
Definition: network_server.cpp:1621
_sync_seed_1
uint32_t _sync_seed_1
Seed to compare during sync checks.
Definition: network.cpp:76
Pool::MAX_SIZE
static constexpr size_t MAX_SIZE
Make template parameter accessible from outside.
Definition: pool_type.hpp:84
ServerNetworkGameSocketHandler::Receive_CLIENT_SET_PASSWORD
NetworkRecvStatus Receive_CLIENT_SET_PASSWORD(Packet &p) override
Set the password for the clients current company: string The password.
Definition: network_server.cpp:1391
DECLARE_POSTFIX_INCREMENT
#define DECLARE_POSTFIX_INCREMENT(enum_type)
Some enums need to have allowed incrementing (i.e.
Definition: enum_type.hpp:14
NetworkClientInfo::GetByClientID
static NetworkClientInfo * GetByClientID(ClientID client_id)
Return the CI given it's client-identifier.
Definition: network.cpp:114
ADMIN_FREQUENCY_QUARTERLY
@ ADMIN_FREQUENCY_QUARTERLY
The admin gets information about this on a quarterly basis.
Definition: tcp_admin.h:96
ServerNetworkGameSocketHandler::Receive_CLIENT_JOIN
NetworkRecvStatus Receive_CLIENT_JOIN(Packet &p) override
Try to join the server: string OpenTTD revision (norev000 if no revision).
Definition: network_server.cpp:859
CommandPacket::company
CompanyID company
company that is executing the command
Definition: network_internal.h:111
FileToSaveLoad::abstract_ftype
AbstractFileType abstract_ftype
Abstract type of file (scenario, heightmap, etc).
Definition: saveload.h:396
FACIL_BUS_STOP
@ FACIL_BUS_STOP
Station with bus stops.
Definition: station_type.h:54
GroupStatistics
Statistics and caches on the vehicles in a group.
Definition: group.h:24
ServerNetworkGameSocketHandler::Receive_CLIENT_GAME_INFO
NetworkRecvStatus Receive_CLIENT_GAME_INFO(Packet &p) override
Request game information.
Definition: network_server.cpp:840
_economy_network_yearly
static IntervalTimer< TimerGameEconomy > _economy_network_yearly({TimerGameEconomy::YEAR, TimerGameEconomy::Priority::NONE}, [](auto) { if(!_network_server) return;NetworkAdminUpdate(ADMIN_FREQUENCY_ANUALLY);})
Economy yearly "callback".
_calendar_network_yearly
static IntervalTimer< TimerGameCalendar > _calendar_network_yearly({ TimerGameCalendar::YEAR, TimerGameCalendar::Priority::NONE }, [](auto) { if(!_network_server) return;NetworkCheckRestartMapYear();})
Calendar yearly "callback".
ServerNetworkGameSocketHandler::GetClientName
std::string GetClientName() const
Get the name of the client, if the user did not send it yet, Client ID is used.
Definition: network_server.cpp:2150
TCPListenHandler
Template for TCP listeners.
Definition: tcp_listen.h:28
ServerNetworkGameSocketHandler::~ServerNetworkGameSocketHandler
~ServerNetworkGameSocketHandler()
Clear everything related to this client.
Definition: network_server.cpp:205
NetworkServerSendExternalChat
void NetworkServerSendExternalChat(const std::string &source, TextColour colour, const std::string &user, const std::string &msg)
Send a chat message from external source.
Definition: network_server.cpp:1353
ServerNetworkGameSocketHandler::ReceivePacket
std::unique_ptr< Packet > ReceivePacket() override
Receives a packet for the given client.
Definition: network_server.cpp:218
COMPANY_NEW_COMPANY
@ COMPANY_NEW_COMPANY
The client wants a new company.
Definition: company_type.h:34
NetworkSettings::server_admin_chat
bool server_admin_chat
allow private chat for the server to be distributed to the admin network
Definition: settings_type.h:310
ServerNetworkGameSocketHandler::STATUS_INACTIVE
@ STATUS_INACTIVE
The client is not connected nor active.
Definition: network_server.h:52
PacketWriter::TransferToNetworkQueue
bool TransferToNetworkQueue(ServerNetworkGameSocketHandler *socket)
Transfer all packets from here to the network's queue while holding the lock on our mutex.
Definition: network_server.cpp:122
ServerNetworkGameSocketHandler::Send
static void Send()
Send the packets for the server sockets.
Definition: network_server.cpp:301
PACKET_SERVER_CHAT
@ PACKET_SERVER_CHAT
Server distributing the message of a client (or itself).
Definition: tcp_game.h:101
CLIENT_ID_FIRST
@ CLIENT_ID_FIRST
The first client ID.
Definition: network_type.h:52
PacketWriter
Writing a savegame directly to a number of packets.
Definition: network_server.cpp:62
PACKET_SERVER_GAME_INFO
@ PACKET_SERVER_GAME_INFO
Information about the server.
Definition: tcp_game.h:46
NetworkServerUpdateCompanyPassworded
void NetworkServerUpdateCompanyPassworded(CompanyID company_id, bool passworded)
Tell that a particular company is (not) passworded.
Definition: network_server.cpp:2008
CommandPacket
Everything we need to know about a command to be able to execute it.
Definition: network_internal.h:109
PACKET_SERVER_COMPANY_UPDATE
@ PACKET_SERVER_COMPANY_UPDATE
Information (password) of a company changed.
Definition: tcp_game.h:115
ServerNetworkGameSocketHandler::SendSync
NetworkRecvStatus SendSync()
Request the client to sync.
Definition: network_server.cpp:639
GRFConfig
Information about GRF, used in the game and (part of it) in savegames.
Definition: newgrf_config.h:147
ServerNetworkGameSocketHandler::SendChat
NetworkRecvStatus SendChat(NetworkAction action, ClientID client_id, bool self_send, const std::string &msg, int64_t data)
Send a chat message.
Definition: network_server.cpp:680
ServerNetworkGameSocketHandler::SendConfigUpdate
NetworkRecvStatus SendConfigUpdate()
Send an update about the max company/spectator counts.
Definition: network_server.cpp:824
SM_NEWGAME
@ SM_NEWGAME
New Game --> 'Random game'.
Definition: openttd.h:28
Packet::Recv_uint32
uint32_t Recv_uint32()
Read a 32 bits integer from the packet.
Definition: packet.cpp:321
PACKET_SERVER_ERROR
@ PACKET_SERVER_ERROR
Server sending an error message to the client.
Definition: tcp_game.h:39
NetworkHandleCommandQueue
static void NetworkHandleCommandQueue(NetworkClientSocket *cs)
Handle the command-queue of a socket.
Definition: network_server.cpp:1701
NetworkCompanyStats::num_vehicle
uint16_t num_vehicle[NETWORK_VEH_END]
How many vehicles are there of this type?
Definition: network_type.h:68
NETWORK_RECV_STATUS_SERVER_ERROR
@ NETWORK_RECV_STATUS_SERVER_ERROR
The server told us we made an error.
Definition: core.h:29
IConsoleCmdExec
void IConsoleCmdExec(const std::string &command_string, const uint recurse_count)
Execute a given command passed to us.
Definition: console.cpp:293
ServerNetworkGameSocketHandler::Receive_CLIENT_MOVE
NetworkRecvStatus Receive_CLIENT_MOVE(Packet &p) override
Request the server to move this client into another company: uint8_t ID of the company the client wan...
Definition: network_server.cpp:1465
ServerNetworkGameSocketHandler::Receive_CLIENT_RCON
NetworkRecvStatus Receive_CLIENT_RCON(Packet &p) override
Send an RCon command to the server: string RCon password.
Definition: network_server.cpp:1441
_last_sync_frame
uint32_t _last_sync_frame
Used in the server to store the last time a sync packet was sent to clients.
Definition: network.cpp:74
ServerNetworkGameSocketHandler::SendMove
NetworkRecvStatus SendMove(ClientID client_id, CompanyID company_id)
Tell that a client moved to another company.
Definition: network_server.cpp:798
ServerNetworkGameSocketHandler::Receive_CLIENT_ERROR
NetworkRecvStatus Receive_CLIENT_ERROR(Packet &p) override
The client made an error and is quitting the game.
Definition: network_server.cpp:1121
ServerNetworkGameSocketHandler::SendJoin
NetworkRecvStatus SendJoin(ClientID client_id)
Tell that a client joined.
Definition: network_server.cpp:603
_settings_game
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition: settings.cpp:55
ServerNetworkGameSocketHandler::SendFrame
NetworkRecvStatus SendFrame()
Tell the client that they may run to a particular frame.
Definition: network_server.cpp:616
MAX_COMPANIES
@ MAX_COMPANIES
Maximum number of companies.
Definition: company_type.h:23
_local_company
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
Definition: company_cmd.cpp:50
CMD_CLIENT_ID
@ CMD_CLIENT_ID
set p2 with the ClientID of the sending client.
Definition: command_type.h:399
PacketWriter::total_size
size_t total_size
Total size of the compressed savegame.
Definition: network_server.cpp:65
ServerNetworkGameSocketHandler::Receive_CLIENT_ACK
NetworkRecvStatus Receive_CLIENT_ACK(Packet &p) override
Tell the server we are done with this frame: uint32_t Current frame counter of the client.
Definition: network_server.cpp:1176
NetworkCompanyState::password
std::string password
The password for the company.
Definition: network_type.h:75
NetworkSettings::max_lag_time
uint16_t max_lag_time
maximum amount of time, in game ticks, a client may be lagging behind the server
Definition: settings_type.h:306
_network_company_states
NetworkCompanyState * _network_company_states
Statistics about some companies.
Definition: network.cpp:64
ServerNetworkGameSocketHandler::SendExternalChat
NetworkRecvStatus SendExternalChat(const std::string &source, TextColour colour, const std::string &user, const std::string &msg)
Send a chat message from external source.
Definition: network_server.cpp:705
ServerNetworkGameSocketHandler::SendCompanyUpdate
NetworkRecvStatus SendCompanyUpdate()
Send an update about the company password states.
Definition: network_server.cpp:811
ServerNetworkGameSocketHandler::SendWelcome
NetworkRecvStatus SendWelcome()
Send the client a welcome message with some basic information.
Definition: network_server.cpp:471
_network_client_id
static ClientID _network_client_id
The identifier counter for new clients (is never decreased)
Definition: network_server.cpp:47
NetworkRestartMap
static void NetworkRestartMap()
Helper function to restart the map.
Definition: network_server.cpp:1845
CommandPacket::my_cmd
bool my_cmd
did the command originate from "me"
Definition: network_internal.h:113
ServerNetworkGameSocketHandler::SendError
NetworkRecvStatus SendError(NetworkErrorCode error, const std::string &reason={})
Send an error to the client, and close its connection.
Definition: network_server.cpp:356
TCP_MTU
static const size_t TCP_MTU
Number of bytes we can pack in a single TCP packet.
Definition: config.h:45
ServerNetworkGameSocketHandler::status
ClientStatus status
Status of this client.
Definition: network_server.h:68
NetworkPopulateCompanyStats
void NetworkPopulateCompanyStats(NetworkCompanyStats *stats)
Populate the company stats.
Definition: network_server.cpp:1497
FACIL_DOCK
@ FACIL_DOCK
Station with a dock.
Definition: station_type.h:56
NetworkSettings::bytes_per_frame_burst
uint16_t bytes_per_frame_burst
how many bytes may, over a short period, be received?
Definition: settings_type.h:301
network_server.h
_network_dedicated
bool _network_dedicated
are we a dedicated server?
Definition: network.cpp:62
Packet
Internal entity of a packet.
Definition: packet.h:42
FT_SAVEGAME
@ FT_SAVEGAME
old or new savegame
Definition: fileio_type.h:18
ServerNetworkGameSocketHandler::SendClientInfo
NetworkRecvStatus SendClientInfo(NetworkClientInfo *ci)
Send the client information about a client.
Definition: network_server.cpp:323
ADMIN_FREQUENCY_ANUALLY
@ ADMIN_FREQUENCY_ANUALLY
The admin gets information about this on a yearly basis.
Definition: tcp_admin.h:97
PACKET_SERVER_WAIT
@ PACKET_SERVER_WAIT
Server tells the client there are some people waiting for the map as well.
Definition: tcp_game.h:75
NETWORK_REVISION_LENGTH
static const uint NETWORK_REVISION_LENGTH
The maximum length of the revision, in bytes including '\0'.
Definition: config.h:58
PACKET_SERVER_MAP_SIZE
@ PACKET_SERVER_MAP_SIZE
Server tells the client what the (compressed) size of the map is.
Definition: tcp_game.h:77
ServerNetworkGameSocketHandler::STATUS_DONE_MAP
@ STATUS_DONE_MAP
The client has downloaded the map.
Definition: network_server.h:59
NetworkCompanyIsPassworded
bool NetworkCompanyIsPassworded(CompanyID company_id)
Check if the company we want to join requires a password.
Definition: network.cpp:209
ServerNetworkGameSocketHandler::SendQuit
NetworkRecvStatus SendQuit(ClientID client_id)
Tell the client another client quit.
Definition: network_server.cpp:744
NetworkClientInfo::client_id
ClientID client_id
Client identifier (same as ClientState->client_id)
Definition: network_base.h:25
DESTTYPE_TEAM
@ DESTTYPE_TEAM
Send message/notice to everyone playing the same company (Team)
Definition: network_type.h:93
NETWORK_PASSWORD_LENGTH
static const uint NETWORK_PASSWORD_LENGTH
The maximum length of the password, in bytes including '\0' (must be >= NETWORK_SERVER_ID_LENGTH)
Definition: config.h:59
ServerNetworkGameSocketHandler::last_token_frame
uint32_t last_token_frame
The last frame we received the right token.
Definition: network_server.h:67
PACKET_SERVER_NEED_GAME_PASSWORD
@ PACKET_SERVER_NEED_GAME_PASSWORD
Server requests the (hashed) game password.
Definition: tcp_game.h:64
GENERATE_NEW_SEED
static const uint32_t GENERATE_NEW_SEED
Create a new random seed.
Definition: genworld.h:24
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.
Definition: network_server.cpp:1235
NetworkAdminCompanyUpdate
void NetworkAdminCompanyUpdate(const Company *company)
Notify the admin network of company updates.
Definition: network_admin.cpp:878
NetworkSettings::server_name
std::string server_name
name of the server
Definition: settings_type.h:314
ServerNetworkGameSocketHandler::SendErrorQuit
NetworkRecvStatus SendErrorQuit(ClientID client_id, NetworkErrorCode errorno)
Tell the client another client quit with an error.
Definition: network_server.cpp:727
NetworkServerNewCompany
void NetworkServerNewCompany(const Company *c, NetworkClientInfo *ci)
Perform all the server specific administration of a new company.
Definition: network_server.cpp:2184
CCA_NEW
@ CCA_NEW
Create a new company.
Definition: company_type.h:68
ServerNetworkGameSocketHandler
Class for handling the server side of the game connection.
Definition: network_server.h:24
NetworkGameSocketHandler::GetInfo
NetworkClientInfo * GetInfo() const
Gets the client info of this socket handler.
Definition: tcp_game.h:526
NetworkSettings::rcon_password
std::string rcon_password
password for rconsole (server side)
Definition: settings_type.h:316
_switch_mode
SwitchMode _switch_mode
The next mainloop command.
Definition: gfx.cpp:48
NetworkSocketHandler::HasClientQuit
bool HasClientQuit() const
Whether the current client connected to the socket has quit.
Definition: core.h:68
ServerNetworkGameSocketHandler::Receive_CLIENT_NEWGRFS_CHECKED
NetworkRecvStatus Receive_CLIENT_NEWGRFS_CHECKED(Packet &p) override
Tell the server that we have the required GRFs.
Definition: network_server.cpp:847
NetworkTCPSocketHandler::SendPackets
SendPacketsState SendPackets(bool closing_down=false)
Sends all the buffered packets out for this client.
Definition: tcp.cpp:86
PACKET_SERVER_MAP_DATA
@ PACKET_SERVER_MAP_DATA
Server sends bits of the map to the client.
Definition: tcp_game.h:78
NETWORK_RCONCOMMAND_LENGTH
static const uint NETWORK_RCONCOMMAND_LENGTH
The maximum length of a rconsole command, in bytes including '\0'.
Definition: config.h:61
NetworkGameSocketHandler::last_frame_server
uint32_t last_frame_server
Last frame the server has executed.
Definition: tcp_game.h:499
NetworkServerDoMove
void NetworkServerDoMove(ClientID client_id, CompanyID company_id)
Handle the tid-bits of moving a client from one company to another.
Definition: network_server.cpp:2028
Pool::PoolItem<&_vehicle_pool >::Iterate
static Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid Titem.
Definition: pool_type.hpp:388
ServerNetworkGameSocketHandler::GetClientIP
const std::string & GetClientIP()
Get the IP address/hostname of the connected client.
Definition: network_server.cpp:1951
GRFConfig::flags
uint8_t flags
NOSAVE: GCF_Flags, bitset.
Definition: newgrf_config.h:164
Pool
Base class for all pools.
Definition: pool_type.hpp:80
SaveWithFilter
SaveOrLoadResult SaveWithFilter(std::shared_ptr< SaveFilter > writer, bool threaded)
Save the game using a (writer) filter.
Definition: saveload.cpp:2876
PacketWriter::current
std::unique_ptr< Packet > current
The packet we're currently writing to.
Definition: network_server.cpp:64
GameCreationSettings::generation_seed
uint32_t generation_seed
noise seed for world generation
Definition: settings_type.h:339
ClientID
ClientID
'Unique' identifier to be given to clients
Definition: network_type.h:49
Pool::PoolItem<&_company_pool >::GetNumItems
static size_t GetNumItems()
Returns number of valid items in the pool.
Definition: pool_type.hpp:369
ServerNetworkGameSocketHandler::SendNewGame
NetworkRecvStatus SendNewGame()
Tell the client we're starting a new game.
Definition: network_server.cpp:767
FACIL_TRAIN
@ FACIL_TRAIN
Station with train station.
Definition: station_type.h:52
network_udp.h
PacketWriter::~PacketWriter
~PacketWriter()
Make sure everything is cleaned up.
Definition: network_server.cpp:79
SpecializedVehicle< RoadVehicle, Type >::From
static RoadVehicle * From(Vehicle *v)
Converts a Vehicle to SpecializedVehicle with type checking.
Definition: vehicle_base.h:1206
PACKET_SERVER_EXTERNAL_CHAT
@ PACKET_SERVER_EXTERNAL_CHAT
Server distributing the message from external source.
Definition: tcp_game.h:102
SaveFilter
Interface for filtering a savegame till it is written.
Definition: saveload_filter.h:59
GetDrawStringCompanyColour
TextColour GetDrawStringCompanyColour(CompanyID company)
Get the colour for DrawString-subroutines which matches the colour of the company.
Definition: company_cmd.cpp:147
_frame_counter
uint32_t _frame_counter
The current frame.
Definition: network.cpp:73
DestType
DestType
Destination of our chat messages.
Definition: network_type.h:91
CommandPacket::data
CommandDataBuffer data
command parameters.
Definition: network_internal.h:118
SetDParam
void SetDParam(size_t n, uint64_t v)
Set a string parameter v at index n in the global string parameter array.
Definition: strings.cpp:104
COMPANY_SPECTATOR
@ COMPANY_SPECTATOR
The client is spectating.
Definition: company_type.h:35
NetworkGameSocketHandler::last_frame
uint32_t last_frame
Last frame we have executed.
Definition: tcp_game.h:498
ServerNetworkGameSocketHandler::Receive_CLIENT_MAP_OK
NetworkRecvStatus Receive_CLIENT_MAP_OK(Packet &p) override
Tell the server that we are done receiving/loading the map.
Definition: network_server.cpp:1004
NetworkRecvStatus
NetworkRecvStatus
Status of a network client; reasons why a client has quit.
Definition: core.h:22
_network_clients_connected
byte _network_clients_connected
The amount of clients connected.
Definition: network.cpp:87
_file_to_saveload
FileToSaveLoad _file_to_saveload
File to save or load in the openttd loop.
Definition: saveload.cpp:60
GRFConfig::next
struct GRFConfig * next
NOSAVE: Next item in the linked list.
Definition: newgrf_config.h:174
ServerNetworkGameSocketHandler::STATUS_NEWGRFS_CHECK
@ STATUS_NEWGRFS_CHECK
The client is checking NewGRFs.
Definition: network_server.h:53
ServerNetworkGameSocketHandler::AllowConnection
static bool AllowConnection()
Whether an connection is allowed or not at this moment.
Definition: network_server.cpp:288
PACKET_SERVER_COMMAND
@ PACKET_SERVER_COMMAND
Server distributes a command to (all) the clients.
Definition: tcp_game.h:97
PACKET_SERVER_MAP_BEGIN
@ PACKET_SERVER_MAP_BEGIN
Server tells the client that it is beginning to send the map.
Definition: tcp_game.h:76
NetworkSettings::max_clients
uint8_t max_clients
maximum amount of clients
Definition: settings_type.h:327
GetString
std::string GetString(StringID string)
Resolve the given StringID into a std::string with all the associated DParam lookups and formatting.
Definition: strings.cpp:327
NetworkSettings::server_password
std::string server_password
password for joining this server
Definition: settings_type.h:315
NetworkSettings::max_companies
uint8_t max_companies
maximum amount of companies
Definition: settings_type.h:326
NetworkAddress::GetHostname
const std::string & GetHostname()
Get the hostname; in case it wasn't given the IPv4 dotted representation is given.
Definition: address.cpp:23
Pool::PoolItem<&_networkclientsocket_pool >::CanAllocateItem
static bool CanAllocateItem(size_t n=1)
Helper functions so we can use PoolItem::Function() instead of _poolitem_pool.Function()
Definition: pool_type.hpp:309
NetworkServerKickClient
void NetworkServerKickClient(ClientID client_id, const std::string &reason)
Kick a single client.
Definition: network_server.cpp:2075
ServerNetworkGameSocketHandler::savegame
std::shared_ptr< struct PacketWriter > savegame
Writer used to write the savegame.
Definition: network_server.h:72
ServerNetworkGameSocketHandler::SendMap
NetworkRecvStatus SendMap()
This sends the map to the client.
Definition: network_server.cpp:550
DESTTYPE_CLIENT
@ DESTTYPE_CLIENT
Send message/notice to only a certain client (Private)
Definition: network_type.h:94
FT_HEIGHTMAP
@ FT_HEIGHTMAP
heightmap file
Definition: fileio_type.h:20
CompanyCtrlAction
CompanyCtrlAction
The action to do with CMD_COMPANY_CTRL.
Definition: company_type.h:67
INVALID_CLIENT_ID
@ INVALID_CLIENT_ID
Client is not part of anything.
Definition: network_type.h:50
PACKET_SERVER_CONFIG_UPDATE
@ PACKET_SERVER_CONFIG_UPDATE
Some network configuration important to the client changed.
Definition: tcp_game.h:116
ServerNetworkGameSocketHandler::SendNewGRFCheck
NetworkRecvStatus SendNewGRFCheck()
Send the check for the NewGRFs.
Definition: network_server.cpp:401
NetworkTCPSocketHandler::ReceivePacket
virtual std::unique_ptr< Packet > ReceivePacket()
Receives a packet for the given client.
Definition: tcp.cpp:129
ServerNetworkGameSocketHandler::STATUS_AUTH_COMPANY
@ STATUS_AUTH_COMPANY
The client is authorizing with company password.
Definition: network_server.h:55
INSTANTIATE_POOL_METHODS
#define INSTANTIATE_POOL_METHODS(name)
Force instantiation of pool methods so we don't get linker errors.
Definition: pool_func.hpp:237
DESTTYPE_BROADCAST
@ DESTTYPE_BROADCAST
Send message/notice to all clients (All)
Definition: network_type.h:92
ServerNetworkGameSocketHandler::SendNeedGamePassword
NetworkRecvStatus SendNeedGamePassword()
Request the game password.
Definition: network_server.cpp:423
NetworkGameSocketHandler::incoming_queue
CommandQueue incoming_queue
The command-queue awaiting handling.
Definition: tcp_game.h:500
NetworkGameSocketHandler::client_id
ClientID client_id
Client identifier.
Definition: tcp_game.h:497
_grfconfig
GRFConfig * _grfconfig
First item in list of current GRF set up.
Definition: newgrf_config.cpp:164
PacketWriter::PacketWriter
PacketWriter(ServerNetworkGameSocketHandler *cs)
Create the packet writer.
Definition: network_server.cpp:74
CRR_AUTOCLEAN
@ CRR_AUTOCLEAN
The company is removed due to autoclean.
Definition: company_type.h:58
CommandHelper
Definition: command_func.h:93
MILLISECONDS_PER_TICK
static const uint MILLISECONDS_PER_TICK
The number of milliseconds per game tick.
Definition: gfx_type.h:320
NetworkServerChangeClientName
bool NetworkServerChangeClientName(ClientID client_id, const std::string &new_name)
Change the client name of the given client.
Definition: network_server.cpp:1660
NetworkAdminClientUpdate
void NetworkAdminClientUpdate(const NetworkClientInfo *ci)
Notify the admin network of a client update (if they did opt in for the respective update).
Definition: network_admin.cpp:819
NetworkGameSocketHandler::SendCommand
void SendCommand(Packet &p, const CommandPacket &cp)
Sends a command over the network.
Definition: network_command.cpp:384
NetworkSettings::bytes_per_frame
uint16_t bytes_per_frame
how many bytes may, over a long period, be received per frame?
Definition: settings_type.h:300
lengthof
#define lengthof(x)
Return the length of an fixed size array.
Definition: stdafx.h:300
_network_ban_list
StringList _network_ban_list
The banned clients.
Definition: network.cpp:70
ClientSettings::network
NetworkSettings network
settings related to the network
Definition: settings_type.h:636
PacketWriter::mutex
std::mutex mutex
Mutex for making threaded saving safe.
Definition: network_server.cpp:67
NetworkSettings::restart_hours
uint16_t restart_hours
number of hours to run the server before automatic restart
Definition: settings_type.h:329
ServerNetworkGameSocketHandler::Receive_CLIENT_CHAT
NetworkRecvStatus Receive_CLIENT_CHAT(Packet &p) override
Sends a chat-packet to the server: uint8_t ID of the action (see NetworkAction).
Definition: network_server.cpp:1361
SlError
void SlError(StringID string, const std::string &extra_msg)
Error handler.
Definition: saveload.cpp:334
ServerNetworkGameSocketHandler::ServerNetworkGameSocketHandler
ServerNetworkGameSocketHandler(SOCKET s)
Create a new socket for the server side of the game connection.
Definition: network_server.cpp:188
RoadVehicle::IsBus
bool IsBus() const
Check whether a roadvehicle is a bus.
Definition: roadveh_cmd.cpp:83
ServerNetworkGameSocketHandler::client_address
NetworkAddress client_address
IP-address of the client (so they can be banned)
Definition: network_server.h:73
PACKET_SERVER_ERROR_QUIT
@ PACKET_SERVER_ERROR_QUIT
A server tells that a client has hit an error and did quit.
Definition: tcp_game.h:126
_network_restart_map_timer
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.
PACKET_SERVER_JOIN
@ PACKET_SERVER_JOIN
Tells clients that a new client has joined.
Definition: tcp_game.h:82
NetworkSettings::autoclean_novehicles
uint8_t autoclean_novehicles
remove companies with no vehicles after this many months
Definition: settings_type.h:325
PacketWriter::Destroy
void Destroy()
Begin the destruction of this packet writer.
Definition: network_server.cpp:101
GenerateCompanyPasswordHash
std::string GenerateCompanyPasswordHash(const std::string &password, const std::string &password_server_id, uint32_t password_game_seed)
Hash the given password using server ID and game seed.
Definition: network.cpp:177
NETWORK_RECV_STATUS_OKAY
@ NETWORK_RECV_STATUS_OKAY
Everything is okay.
Definition: core.h:23
SB
constexpr T SB(T &x, const uint8_t s, const uint8_t n, const U d)
Set n bits in x starting at bit s to d.
Definition: bitmath_func.hpp:58
ADMIN_FREQUENCY_WEEKLY
@ ADMIN_FREQUENCY_WEEKLY
The admin gets information about this on a weekly basis.
Definition: tcp_admin.h:94
NetworkServerUpdateGameInfo
void NetworkServerUpdateGameInfo()
Update the server's NetworkServerGameInfo due to changes in settings.
Definition: network_server.cpp:1998
Ticks::DAY_TICKS
static constexpr TimerGameTick::Ticks DAY_TICKS
1 day is 74 ticks; TimerGameCalendar::date_fract used to be uint16_t and incremented by 885.
Definition: timer_game_tick.h:48
ServerNetworkGameSocketHandler::SendShutdown
NetworkRecvStatus SendShutdown()
Tell the client we're shutting down.
Definition: network_server.cpp:757
VEH_TRAIN
@ VEH_TRAIN
Train vehicle type.
Definition: vehicle_type.h:24
NetworkSettings::autoclean_unprotected
uint8_t autoclean_unprotected
remove passwordless companies after this many months
Definition: settings_type.h:323
Pool::PoolItem<&_company_pool >::IsValidID
static bool IsValidID(size_t index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
Definition: pool_type.hpp:328
_network_weekly
static IntervalTimer< TimerGameEconomy > _network_weekly({TimerGameEconomy::WEEK, TimerGameEconomy::Priority::NONE}, [](auto) { if(!_network_server) return;NetworkAdminUpdate(ADMIN_FREQUENCY_WEEKLY);})
Economy weekly "callback".
ServerNetworkGameSocketHandler::SendRConResult
NetworkRecvStatus SendRConResult(uint16_t colour, const std::string &command)
Send the result of a console action.
Definition: network_server.cpp:781
NetworkSettings::max_init_time
uint16_t max_init_time
maximum amount of time, in game ticks, a client may take to initiate joining
Definition: settings_type.h:302
FACIL_AIRPORT
@ FACIL_AIRPORT
Station with an airport.
Definition: station_type.h:55
CMD_SERVER
@ CMD_SERVER
the command can only be initiated by the server
Definition: command_type.h:392
CMD_SPECTATOR
@ CMD_SPECTATOR
the command may be initiated by a spectator
Definition: command_type.h:393
ServerNetworkGameSocketHandler::last_token
byte last_token
The last random token we did send to verify the client is listening.
Definition: network_server.h:66
PacketWriter::exit_sig
std::condition_variable exit_sig
Signal for threaded destruction of this packet writer.
Definition: network_server.cpp:68
network_admin.h
NetworkServerGameInfo::clients_on
byte clients_on
Current count of clients on server.
Definition: network_game_info.h:107
ServerNetworkGameSocketHandler::Receive_CLIENT_QUIT
NetworkRecvStatus Receive_CLIENT_QUIT(Packet &p) override
The client is quitting the game.
Definition: network_server.cpp:1152
CC_WARNING
static const TextColour CC_WARNING
Colour for warning lines.
Definition: console_type.h:25
CCA_DELETE
@ CCA_DELETE
Delete a company.
Definition: company_type.h:70
MAX_CLIENT_SLOTS
static const uint MAX_CLIENT_SLOTS
The number of slots; must be at least 1 more than MAX_CLIENTS.
Definition: network_type.h:23
NetworkServerSetCompanyPassword
void NetworkServerSetCompanyPassword(CompanyID company_id, const std::string &password, bool already_hashed)
Set/Reset a company password on the server end.
Definition: network_server.cpp:1684
VEH_SHIP
@ VEH_SHIP
Ship vehicle type.
Definition: vehicle_type.h:26
Company
Definition: company_base.h:129
ServerNetworkGameSocketHandler::SendNeedCompanyPassword
NetworkRecvStatus SendNeedCompanyPassword()
Request the company password.
Definition: network_server.cpp:446
SetWindowClassesDirty
void SetWindowClassesDirty(WindowClass cls)
Mark all windows of a particular class as dirty (in need of repainting)
Definition: window.cpp:3112
SL_OK
@ SL_OK
completed successfully
Definition: saveload.h:387
CLIENT_ID_SERVER
@ CLIENT_ID_SERVER
Servers always have this ID.
Definition: network_type.h:51
_networkclientsocket_pool
NetworkClientSocketPool _networkclientsocket_pool("NetworkClientSocket")
Make very sure the preconditions given in network_type.h are actually followed.
NetworkErrorCode
NetworkErrorCode
The error codes we send around in the protocols.
Definition: network_type.h:122
NetworkClientInfo
Container for all information known about a client.
Definition: network_base.h:24
NetworkIsValidClientName
bool NetworkIsValidClientName(const std::string_view client_name)
Check whether the given client name is deemed valid for use in network games.
Definition: network_client.cpp:1308
ServerNetworkGameSocketHandler::CloseConnection
NetworkRecvStatus CloseConnection(NetworkRecvStatus status) override
Close the network connection due to the given status.
Definition: network_server.cpp:231
_frame_counter_max
uint32_t _frame_counter_max
To where we may go with our clients.
Definition: network.cpp:72
_network_monthly
static IntervalTimer< TimerGameEconomy > _network_monthly({TimerGameEconomy::MONTH, TimerGameEconomy::Priority::NONE}, [](auto) { if(!_network_server) return;NetworkAutoCleanCompanies();NetworkAdminUpdate(ADMIN_FREQUENCY_MONTHLY);})
Economy monthly "callback".
NetworkClientInfo::join_date
TimerGameEconomy::Date join_date
Gamedate the client has joined.
Definition: network_base.h:28
ServerNetworkGameSocketHandler::STATUS_AUTH_GAME
@ STATUS_AUTH_GAME
The client is authorizing with game (server) password.
Definition: network_server.h:54
NetworkCompanyHasClients
bool NetworkCompanyHasClients(CompanyID company)
Check whether a particular company has clients.
Definition: network_server.cpp:2136
Packet::Recv_uint8
uint8_t Recv_uint8()
Read a 8 bits integer from the packet.
Definition: packet.cpp:292
_settings_newgame
GameSettings _settings_newgame
Game settings for new games (updated from the intro screen).
Definition: settings.cpp:56
NetworkAdminClientError
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).
Definition: network_admin.cpp:846
GCF_STATIC
@ GCF_STATIC
GRF file is used statically (can be used in any MP game)
Definition: newgrf_config.h:25
PACKET_SERVER_NEED_COMPANY_PASSWORD
@ PACKET_SERVER_NEED_COMPANY_PASSWORD
Server requests the (hashed) company password.
Definition: tcp_game.h:66
ServerNetworkGameSocketHandler::SendWait
NetworkRecvStatus SendWait()
Tell the client that its put in a waiting queue.
Definition: network_server.cpp:502
NetworkSettings::autoclean_companies
bool autoclean_companies
automatically remove companies that are not in use
Definition: settings_type.h:322
NetworkSettings::network_id
std::string network_id
network ID for servers
Definition: settings_type.h:321
ServerNetworkGameSocketHandler::STATUS_AUTHORIZED
@ STATUS_AUTHORIZED
The client is authorized.
Definition: network_server.h:56
TimerGameCalendar::year
static Year year
Current year, starting at 0.
Definition: timer_game_calendar.h:32
PACKET_SERVER_WELCOME
@ PACKET_SERVER_WELCOME
Server welcomes you and gives you your ClientID.
Definition: tcp_game.h:70
NETWORK_RECV_STATUS_MALFORMED_PACKET
@ NETWORK_RECV_STATUS_MALFORMED_PACKET
We apparently send a malformed packet.
Definition: core.h:28
NetworkUpdateClientInfo
void NetworkUpdateClientInfo(ClientID client_id)
Send updated client info of a particular client.
Definition: network_server.cpp:1533
CommandPacket::cmd
Commands cmd
command being executed.
Definition: network_internal.h:115
TimerGameEconomy::date
static Date date
Current date in days (day counter).
Definition: timer_game_economy.h:37
IConsolePrint
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.
Definition: console.cpp:91
HasBit
constexpr debug_inline bool HasBit(const T x, const uint8_t y)
Checks if a bit in a value is set.
Definition: bitmath_func.hpp:103