src/network/network_server.cpp
changeset 5900 135d10dd7219
parent 5898 4c682e9a58cc
child 5902 a9508c166390
equal deleted inserted replaced
5899:6f5ece1805fe 5900:135d10dd7219
    46 	//    String: The unique id of the client
    46 	//    String: The unique id of the client
    47 	//
    47 	//
    48 
    48 
    49 	if (ci->client_index != NETWORK_EMPTY_INDEX) {
    49 	if (ci->client_index != NETWORK_EMPTY_INDEX) {
    50 		Packet *p = NetworkSend_Init(PACKET_SERVER_CLIENT_INFO);
    50 		Packet *p = NetworkSend_Init(PACKET_SERVER_CLIENT_INFO);
    51 		NetworkSend_uint16(p, ci->client_index);
    51 		p->Send_uint16(ci->client_index);
    52 		NetworkSend_uint8 (p, ci->client_playas);
    52 		p->Send_uint8 (ci->client_playas);
    53 		NetworkSend_string(p, ci->client_name);
    53 		p->Send_string(ci->client_name);
    54 		NetworkSend_string(p, ci->unique_id);
    54 		p->Send_string(ci->unique_id);
    55 
    55 
    56 		NetworkSend_Packet(p, cs);
    56 		NetworkSend_Packet(p, cs);
    57 	}
    57 	}
    58 }
    58 }
    59 
    59 
    73 	byte active = ActivePlayerCount();
    73 	byte active = ActivePlayerCount();
    74 
    74 
    75 	if (active == 0) {
    75 	if (active == 0) {
    76 		p = NetworkSend_Init(PACKET_SERVER_COMPANY_INFO);
    76 		p = NetworkSend_Init(PACKET_SERVER_COMPANY_INFO);
    77 
    77 
    78 		NetworkSend_uint8 (p, NETWORK_COMPANY_INFO_VERSION);
    78 		p->Send_uint8 (NETWORK_COMPANY_INFO_VERSION);
    79 		NetworkSend_uint8 (p, active);
    79 		p->Send_uint8 (active);
    80 
    80 
    81 		NetworkSend_Packet(p, cs);
    81 		NetworkSend_Packet(p, cs);
    82 		return;
    82 		return;
    83 	}
    83 	}
    84 
    84 
    87 	FOR_ALL_PLAYERS(player) {
    87 	FOR_ALL_PLAYERS(player) {
    88 		if (!player->is_active) continue;
    88 		if (!player->is_active) continue;
    89 
    89 
    90 		p = NetworkSend_Init(PACKET_SERVER_COMPANY_INFO);
    90 		p = NetworkSend_Init(PACKET_SERVER_COMPANY_INFO);
    91 
    91 
    92 		NetworkSend_uint8 (p, NETWORK_COMPANY_INFO_VERSION);
    92 		p->Send_uint8 (NETWORK_COMPANY_INFO_VERSION);
    93 		NetworkSend_uint8 (p, active);
    93 		p->Send_uint8 (active);
    94 		NetworkSend_uint8 (p, player->index);
    94 		p->Send_uint8 (player->index);
    95 
    95 
    96 		NetworkSend_string(p, _network_player_info[player->index].company_name);
    96 		p->Send_string(_network_player_info[player->index].company_name);
    97 		NetworkSend_uint32(p, _network_player_info[player->index].inaugurated_year);
    97 		p->Send_uint32(_network_player_info[player->index].inaugurated_year);
    98 		NetworkSend_uint64(p, _network_player_info[player->index].company_value);
    98 		p->Send_uint64(_network_player_info[player->index].company_value);
    99 		NetworkSend_uint64(p, _network_player_info[player->index].money);
    99 		p->Send_uint64(_network_player_info[player->index].money);
   100 		NetworkSend_uint64(p, _network_player_info[player->index].income);
   100 		p->Send_uint64(_network_player_info[player->index].income);
   101 		NetworkSend_uint16(p, _network_player_info[player->index].performance);
   101 		p->Send_uint16(_network_player_info[player->index].performance);
   102 
   102 
   103 		/* Send 1 if there is a passord for the company else send 0 */
   103 		/* Send 1 if there is a passord for the company else send 0 */
   104 		if (_network_player_info[player->index].password[0] != '\0') {
   104 		p->Send_uint8(StrEmpty(_network_player_info[player->index].password) ? 0 : 1);
   105 			NetworkSend_uint8(p, 1);
   105 
       
   106 		for (i = 0; i < NETWORK_VEHICLE_TYPES; i++) {
       
   107 			p->Send_uint16(_network_player_info[player->index].num_vehicle[i]);
       
   108 		}
       
   109 
       
   110 		for (i = 0; i < NETWORK_STATION_TYPES; i++) {
       
   111 			p->Send_uint16(_network_player_info[player->index].num_station[i]);
       
   112 		}
       
   113 
       
   114 		if (_network_player_info[player->index].players[0] == '\0') {
       
   115 			p->Send_string("<none>");
   106 		} else {
   116 		} else {
   107 			NetworkSend_uint8(p, 0);
   117 			p->Send_string(_network_player_info[player->index].players);
   108 		}
       
   109 
       
   110 		for (i = 0; i < NETWORK_VEHICLE_TYPES; i++) {
       
   111 			NetworkSend_uint16(p, _network_player_info[player->index].num_vehicle[i]);
       
   112 		}
       
   113 
       
   114 		for (i = 0; i < NETWORK_STATION_TYPES; i++) {
       
   115 			NetworkSend_uint16(p, _network_player_info[player->index].num_station[i]);
       
   116 		}
       
   117 
       
   118 		if (_network_player_info[player->index].players[0] == '\0') {
       
   119 			NetworkSend_string(p, "<none>");
       
   120 		} else {
       
   121 			NetworkSend_string(p, _network_player_info[player->index].players);
       
   122 		}
   118 		}
   123 
   119 
   124 		NetworkSend_Packet(p, cs);
   120 		NetworkSend_Packet(p, cs);
   125 	}
   121 	}
   126 
   122 
   127 	p = NetworkSend_Init(PACKET_SERVER_COMPANY_INFO);
   123 	p = NetworkSend_Init(PACKET_SERVER_COMPANY_INFO);
   128 
   124 
   129 	NetworkSend_uint8 (p, NETWORK_COMPANY_INFO_VERSION);
   125 	p->Send_uint8 (NETWORK_COMPANY_INFO_VERSION);
   130 	NetworkSend_uint8 (p, 0);
   126 	p->Send_uint8 (0);
   131 
   127 
   132 	NetworkSend_Packet(p, cs);
   128 	NetworkSend_Packet(p, cs);
   133 }
   129 }
   134 
   130 
   135 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_ERROR)(NetworkTCPSocketHandler *cs, NetworkErrorCode error)
   131 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_ERROR)(NetworkTCPSocketHandler *cs, NetworkErrorCode error)
   142 	//
   138 	//
   143 
   139 
   144 	char str[100];
   140 	char str[100];
   145 	Packet *p = NetworkSend_Init(PACKET_SERVER_ERROR);
   141 	Packet *p = NetworkSend_Init(PACKET_SERVER_ERROR);
   146 
   142 
   147 	NetworkSend_uint8(p, error);
   143 	p->Send_uint8(error);
   148 	NetworkSend_Packet(p, cs);
   144 	NetworkSend_Packet(p, cs);
   149 
   145 
   150 	GetNetworkErrorMsg(str, error, lastof(str));
   146 	GetNetworkErrorMsg(str, error, lastof(str));
   151 
   147 
   152 	// Only send when the current client was in game
   148 	// Only send when the current client was in game
   199 	const GRFConfig *c;
   195 	const GRFConfig *c;
   200 	uint grf_count = 0;
   196 	uint grf_count = 0;
   201 
   197 
   202 	for (c = _grfconfig; c != NULL; c = c->next) grf_count++;
   198 	for (c = _grfconfig; c != NULL; c = c->next) grf_count++;
   203 
   199 
   204 	NetworkSend_uint8 (p, grf_count);
   200 	p->Send_uint8 (grf_count);
   205 	for (c = _grfconfig; c != NULL; c = c->next) {
   201 	for (c = _grfconfig; c != NULL; c = c->next) {
   206 		cs->Send_GRFIdentifier(p, c);
   202 		cs->Send_GRFIdentifier(p, c);
   207 	}
   203 	}
   208 
   204 
   209 	NetworkSend_Packet(p, cs);
   205 	NetworkSend_Packet(p, cs);
   217 	// Data:
   213 	// Data:
   218 	//    uint8:  Type of password
   214 	//    uint8:  Type of password
   219 	//
   215 	//
   220 
   216 
   221 	Packet *p = NetworkSend_Init(PACKET_SERVER_NEED_PASSWORD);
   217 	Packet *p = NetworkSend_Init(PACKET_SERVER_NEED_PASSWORD);
   222 	NetworkSend_uint8(p, type);
   218 	p->Send_uint8(type);
   223 	NetworkSend_Packet(p, cs);
   219 	NetworkSend_Packet(p, cs);
   224 }
   220 }
   225 
   221 
   226 DEF_SERVER_SEND_COMMAND(PACKET_SERVER_WELCOME)
   222 DEF_SERVER_SEND_COMMAND(PACKET_SERVER_WELCOME)
   227 {
   223 {
   240 
   236 
   241 	cs->status = STATUS_AUTH;
   237 	cs->status = STATUS_AUTH;
   242 	_network_game_info.clients_on++;
   238 	_network_game_info.clients_on++;
   243 
   239 
   244 	p = NetworkSend_Init(PACKET_SERVER_WELCOME);
   240 	p = NetworkSend_Init(PACKET_SERVER_WELCOME);
   245 	NetworkSend_uint16(p, cs->index);
   241 	p->Send_uint16(cs->index);
   246 	NetworkSend_Packet(p, cs);
   242 	NetworkSend_Packet(p, cs);
   247 
   243 
   248 		// Transmit info about all the active clients
   244 		// Transmit info about all the active clients
   249 	FOR_ALL_CLIENTS(new_cs) {
   245 	FOR_ALL_CLIENTS(new_cs) {
   250 		if (new_cs != cs && new_cs->status > STATUS_AUTH)
   246 		if (new_cs != cs && new_cs->status > STATUS_AUTH)
   271 	FOR_ALL_CLIENTS(new_cs) {
   267 	FOR_ALL_CLIENTS(new_cs) {
   272 		if (new_cs->status == STATUS_MAP_WAIT) waiting++;
   268 		if (new_cs->status == STATUS_MAP_WAIT) waiting++;
   273 	}
   269 	}
   274 
   270 
   275 	p = NetworkSend_Init(PACKET_SERVER_WAIT);
   271 	p = NetworkSend_Init(PACKET_SERVER_WAIT);
   276 	NetworkSend_uint8(p, waiting);
   272 	p->Send_uint8(waiting);
   277 	NetworkSend_Packet(p, cs);
   273 	NetworkSend_Packet(p, cs);
   278 }
   274 }
   279 
   275 
   280 // This sends the map to the client
   276 // This sends the map to the client
   281 DEF_SERVER_SEND_COMMAND(PACKET_SERVER_MAP)
   277 DEF_SERVER_SEND_COMMAND(PACKET_SERVER_MAP)
   318 
   314 
   319 		if (ftell(file_pointer) == 0) error("network savedump failed - zero sized savegame?");
   315 		if (ftell(file_pointer) == 0) error("network savedump failed - zero sized savegame?");
   320 
   316 
   321 		// Now send the _frame_counter and how many packets are coming
   317 		// Now send the _frame_counter and how many packets are coming
   322 		p = NetworkSend_Init(PACKET_SERVER_MAP);
   318 		p = NetworkSend_Init(PACKET_SERVER_MAP);
   323 		NetworkSend_uint8(p, MAP_PACKET_START);
   319 		p->Send_uint8 (MAP_PACKET_START);
   324 		NetworkSend_uint32(p, _frame_counter);
   320 		p->Send_uint32(_frame_counter);
   325 		NetworkSend_uint32(p, ftell(file_pointer));
   321 		p->Send_uint32(ftell(file_pointer));
   326 		NetworkSend_Packet(p, cs);
   322 		NetworkSend_Packet(p, cs);
   327 
   323 
   328 		fseek(file_pointer, 0, SEEK_SET);
   324 		fseek(file_pointer, 0, SEEK_SET);
   329 
   325 
   330 		sent_packets = 4; // We start with trying 4 packets
   326 		sent_packets = 4; // We start with trying 4 packets
   338 	if (cs->status == STATUS_MAP) {
   334 	if (cs->status == STATUS_MAP) {
   339 		uint i;
   335 		uint i;
   340 		int res;
   336 		int res;
   341 		for (i = 0; i < sent_packets; i++) {
   337 		for (i = 0; i < sent_packets; i++) {
   342 			Packet *p = NetworkSend_Init(PACKET_SERVER_MAP);
   338 			Packet *p = NetworkSend_Init(PACKET_SERVER_MAP);
   343 			NetworkSend_uint8(p, MAP_PACKET_NORMAL);
   339 			p->Send_uint8(MAP_PACKET_NORMAL);
   344 			res = (int)fread(p->buffer + p->size, 1, SEND_MTU - p->size, file_pointer);
   340 			res = (int)fread(p->buffer + p->size, 1, SEND_MTU - p->size, file_pointer);
   345 
   341 
   346 			if (ferror(file_pointer)) error("Error reading temporary network savegame!");
   342 			if (ferror(file_pointer)) error("Error reading temporary network savegame!");
   347 
   343 
   348 			p->size += res;
   344 			p->size += res;
   349 			NetworkSend_Packet(p, cs);
   345 			NetworkSend_Packet(p, cs);
   350 			if (feof(file_pointer)) {
   346 			if (feof(file_pointer)) {
   351 				// Done reading!
   347 				// Done reading!
   352 				Packet *p = NetworkSend_Init(PACKET_SERVER_MAP);
   348 				Packet *p = NetworkSend_Init(PACKET_SERVER_MAP);
   353 				NetworkSend_uint8(p, MAP_PACKET_END);
   349 				p->Send_uint8(MAP_PACKET_END);
   354 				NetworkSend_Packet(p, cs);
   350 				NetworkSend_Packet(p, cs);
   355 
   351 
   356 				// Set the status to DONE_MAP, no we will wait for the client
   352 				// Set the status to DONE_MAP, no we will wait for the client
   357 				//  to send it is ready (maybe that happens like never ;))
   353 				//  to send it is ready (maybe that happens like never ;))
   358 				cs->status = STATUS_DONE_MAP;
   354 				cs->status = STATUS_DONE_MAP;
   407 	//    uint16:  Client-Index
   403 	//    uint16:  Client-Index
   408 	//
   404 	//
   409 
   405 
   410 	Packet *p = NetworkSend_Init(PACKET_SERVER_JOIN);
   406 	Packet *p = NetworkSend_Init(PACKET_SERVER_JOIN);
   411 
   407 
   412 	NetworkSend_uint16(p, client_index);
   408 	p->Send_uint16(client_index);
   413 
   409 
   414 	NetworkSend_Packet(p, cs);
   410 	NetworkSend_Packet(p, cs);
   415 }
   411 }
   416 
   412 
   417 
   413 
   427 	//    [uint32: general-seed-2]
   423 	//    [uint32: general-seed-2]
   428 	//      (last two depends on compile-settings, and are not default settings)
   424 	//      (last two depends on compile-settings, and are not default settings)
   429 	//
   425 	//
   430 
   426 
   431 	Packet *p = NetworkSend_Init(PACKET_SERVER_FRAME);
   427 	Packet *p = NetworkSend_Init(PACKET_SERVER_FRAME);
   432 	NetworkSend_uint32(p, _frame_counter);
   428 	p->Send_uint32(_frame_counter);
   433 	NetworkSend_uint32(p, _frame_counter_max);
   429 	p->Send_uint32(_frame_counter_max);
   434 #ifdef ENABLE_NETWORK_SYNC_EVERY_FRAME
   430 #ifdef ENABLE_NETWORK_SYNC_EVERY_FRAME
   435 	NetworkSend_uint32(p, _sync_seed_1);
   431 	p->Send_uint32(_sync_seed_1);
   436 #ifdef NETWORK_SEND_DOUBLE_SEED
   432 #ifdef NETWORK_SEND_DOUBLE_SEED
   437 	NetworkSend_uint32(p, _sync_seed_2);
   433 	p->Send_uint32(_sync_seed_2);
   438 #endif
   434 #endif
   439 #endif
   435 #endif
   440 	NetworkSend_Packet(p, cs);
   436 	NetworkSend_Packet(p, cs);
   441 }
   437 }
   442 
   438 
   451 	//    [uint32: general-seed-2]
   447 	//    [uint32: general-seed-2]
   452 	//      (last one depends on compile-settings, and are not default settings)
   448 	//      (last one depends on compile-settings, and are not default settings)
   453 	//
   449 	//
   454 
   450 
   455 	Packet *p = NetworkSend_Init(PACKET_SERVER_SYNC);
   451 	Packet *p = NetworkSend_Init(PACKET_SERVER_SYNC);
   456 	NetworkSend_uint32(p, _frame_counter);
   452 	p->Send_uint32(_frame_counter);
   457 	NetworkSend_uint32(p, _sync_seed_1);
   453 	p->Send_uint32(_sync_seed_1);
   458 
   454 
   459 #ifdef NETWORK_SEND_DOUBLE_SEED
   455 #ifdef NETWORK_SEND_DOUBLE_SEED
   460 	NetworkSend_uint32(p, _sync_seed_2);
   456 	p->Send_uint32(_sync_seed_2);
   461 #endif
   457 #endif
   462 	NetworkSend_Packet(p, cs);
   458 	NetworkSend_Packet(p, cs);
   463 }
   459 }
   464 
   460 
   465 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_COMMAND)(NetworkTCPSocketHandler *cs, CommandPacket *cp)
   461 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_COMMAND)(NetworkTCPSocketHandler *cs, CommandPacket *cp)
   478 	//    uint32: Frame of execution
   474 	//    uint32: Frame of execution
   479 	//
   475 	//
   480 
   476 
   481 	Packet *p = NetworkSend_Init(PACKET_SERVER_COMMAND);
   477 	Packet *p = NetworkSend_Init(PACKET_SERVER_COMMAND);
   482 
   478 
   483 	NetworkSend_uint8(p, cp->player);
   479 	p->Send_uint8 (cp->player);
   484 	NetworkSend_uint32(p, cp->cmd);
   480 	p->Send_uint32(cp->cmd);
   485 	NetworkSend_uint32(p, cp->p1);
   481 	p->Send_uint32(cp->p1);
   486 	NetworkSend_uint32(p, cp->p2);
   482 	p->Send_uint32(cp->p2);
   487 	NetworkSend_uint32(p, cp->tile);
   483 	p->Send_uint32(cp->tile);
   488 	NetworkSend_string(p, cp->text);
   484 	p->Send_string(cp->text);
   489 	NetworkSend_uint8(p, cp->callback);
   485 	p->Send_uint8 (cp->callback);
   490 	NetworkSend_uint32(p, cp->frame);
   486 	p->Send_uint32(cp->frame);
   491 
   487 
   492 	NetworkSend_Packet(p, cs);
   488 	NetworkSend_Packet(p, cs);
   493 }
   489 }
   494 
   490 
   495 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_CHAT)(NetworkTCPSocketHandler *cs, NetworkAction action, uint16 client_index, bool self_send, const char *msg)
   491 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_CHAT)(NetworkTCPSocketHandler *cs, NetworkAction action, uint16 client_index, bool self_send, const char *msg)
   503 	//    String: Message (max MAX_TEXT_MSG_LEN)
   499 	//    String: Message (max MAX_TEXT_MSG_LEN)
   504 	//
   500 	//
   505 
   501 
   506 	Packet *p = NetworkSend_Init(PACKET_SERVER_CHAT);
   502 	Packet *p = NetworkSend_Init(PACKET_SERVER_CHAT);
   507 
   503 
   508 	NetworkSend_uint8(p, action);
   504 	p->Send_uint8 (action);
   509 	NetworkSend_uint16(p, client_index);
   505 	p->Send_uint16(client_index);
   510 	NetworkSend_uint8(p, self_send);
   506 	p->Send_uint8 (self_send);
   511 	NetworkSend_string(p, msg);
   507 	p->Send_string(msg);
   512 
   508 
   513 	NetworkSend_Packet(p, cs);
   509 	NetworkSend_Packet(p, cs);
   514 }
   510 }
   515 
   511 
   516 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_ERROR_QUIT)(NetworkTCPSocketHandler *cs, uint16 client_index, NetworkErrorCode errorno)
   512 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_ERROR_QUIT)(NetworkTCPSocketHandler *cs, uint16 client_index, NetworkErrorCode errorno)
   524 	//    uint8:  ErrorID (see network_data.h, NetworkErrorCode)
   520 	//    uint8:  ErrorID (see network_data.h, NetworkErrorCode)
   525 	//
   521 	//
   526 
   522 
   527 	Packet *p = NetworkSend_Init(PACKET_SERVER_ERROR_QUIT);
   523 	Packet *p = NetworkSend_Init(PACKET_SERVER_ERROR_QUIT);
   528 
   524 
   529 	NetworkSend_uint16(p, client_index);
   525 	p->Send_uint16(client_index);
   530 	NetworkSend_uint8(p, errorno);
   526 	p->Send_uint8 (errorno);
   531 
   527 
   532 	NetworkSend_Packet(p, cs);
   528 	NetworkSend_Packet(p, cs);
   533 }
   529 }
   534 
   530 
   535 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_QUIT)(NetworkTCPSocketHandler *cs, uint16 client_index, const char *leavemsg)
   531 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_QUIT)(NetworkTCPSocketHandler *cs, uint16 client_index, const char *leavemsg)
   543 	//    String: leave-message
   539 	//    String: leave-message
   544 	//
   540 	//
   545 
   541 
   546 	Packet *p = NetworkSend_Init(PACKET_SERVER_QUIT);
   542 	Packet *p = NetworkSend_Init(PACKET_SERVER_QUIT);
   547 
   543 
   548 	NetworkSend_uint16(p, client_index);
   544 	p->Send_uint16(client_index);
   549 	NetworkSend_string(p, leavemsg);
   545 	p->Send_string(leavemsg);
   550 
   546 
   551 	NetworkSend_Packet(p, cs);
   547 	NetworkSend_Packet(p, cs);
   552 }
   548 }
   553 
   549 
   554 DEF_SERVER_SEND_COMMAND(PACKET_SERVER_SHUTDOWN)
   550 DEF_SERVER_SEND_COMMAND(PACKET_SERVER_SHUTDOWN)
   579 
   575 
   580 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_RCON)(NetworkTCPSocketHandler *cs, uint16 color, const char *command)
   576 DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_RCON)(NetworkTCPSocketHandler *cs, uint16 color, const char *command)
   581 {
   577 {
   582 	Packet *p = NetworkSend_Init(PACKET_SERVER_RCON);
   578 	Packet *p = NetworkSend_Init(PACKET_SERVER_RCON);
   583 
   579 
   584 	NetworkSend_uint16(p, color);
   580 	p->Send_uint16(color);
   585 	NetworkSend_string(p, command);
   581 	p->Send_string(command);
   586 	NetworkSend_Packet(p, cs);
   582 	NetworkSend_Packet(p, cs);
   587 }
   583 }
   588 
   584 
   589 // **********
   585 // **********
   590 // Receiving functions
   586 // Receiving functions
   619 	NetworkClientInfo *ci;
   615 	NetworkClientInfo *ci;
   620 	PlayerID playas;
   616 	PlayerID playas;
   621 	NetworkLanguage client_lang;
   617 	NetworkLanguage client_lang;
   622 	char client_revision[NETWORK_REVISION_LENGTH];
   618 	char client_revision[NETWORK_REVISION_LENGTH];
   623 
   619 
   624 	NetworkRecv_string(cs, p, client_revision, sizeof(client_revision));
   620 	p->Recv_string(client_revision, sizeof(client_revision));
   625 
   621 
   626 #if defined(WITH_REV) || defined(WITH_REV_HACK)
   622 #if defined(WITH_REV) || defined(WITH_REV_HACK)
   627 	// Check if the client has revision control enabled
   623 	// Check if the client has revision control enabled
   628 	if (strcmp(NOREV_STRING, client_revision) != 0 &&
   624 	if (strcmp(NOREV_STRING, client_revision) != 0 &&
   629 			strcmp(_network_game_info.server_revision, client_revision) != 0) {
   625 			strcmp(_network_game_info.server_revision, client_revision) != 0) {
   631 		SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_WRONG_REVISION);
   627 		SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_WRONG_REVISION);
   632 		return;
   628 		return;
   633 	}
   629 	}
   634 #endif
   630 #endif
   635 
   631 
   636 	NetworkRecv_string(cs, p, name, sizeof(name));
   632 	p->Recv_string(name, sizeof(name));
   637 	playas = (Owner)NetworkRecv_uint8(cs, p);
   633 	playas = (Owner)p->Recv_uint8();
   638 	client_lang = (NetworkLanguage)NetworkRecv_uint8(cs, p);
   634 	client_lang = (NetworkLanguage)p->Recv_uint8();
   639 	NetworkRecv_string(cs, p, unique_id, sizeof(unique_id));
   635 	p->Recv_string(unique_id, sizeof(unique_id));
   640 
   636 
   641 	if (cs->has_quit) return;
   637 	if (cs->has_quit) return;
   642 
   638 
   643 	// join another company does not affect these values
   639 	// join another company does not affect these values
   644 	switch (playas) {
   640 	switch (playas) {
   692 {
   688 {
   693 	NetworkPasswordType type;
   689 	NetworkPasswordType type;
   694 	char password[NETWORK_PASSWORD_LENGTH];
   690 	char password[NETWORK_PASSWORD_LENGTH];
   695 	const NetworkClientInfo *ci;
   691 	const NetworkClientInfo *ci;
   696 
   692 
   697 	type = (NetworkPasswordType)NetworkRecv_uint8(cs, p);
   693 	type = (NetworkPasswordType)p->Recv_uint8();
   698 	NetworkRecv_string(cs, p, password, sizeof(password));
   694 	p->Recv_string(password, sizeof(password));
   699 
   695 
   700 	if (cs->status == STATUS_INACTIVE && type == NETWORK_GAME_PASSWORD) {
   696 	if (cs->status == STATUS_INACTIVE && type == NETWORK_GAME_PASSWORD) {
   701 		// Check game-password
   697 		// Check game-password
   702 		if (strcmp(password, _network_game_info.server_password) != 0) {
   698 		if (strcmp(password, _network_game_info.server_password) != 0) {
   703 			// Password is invalid
   699 			// Password is invalid
   839 	if (cs->status < STATUS_DONE_MAP || cs->has_quit) {
   835 	if (cs->status < STATUS_DONE_MAP || cs->has_quit) {
   840 		SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED);
   836 		SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED);
   841 		return;
   837 		return;
   842 	}
   838 	}
   843 
   839 
   844 	cp->player = (Owner)NetworkRecv_uint8(cs, p);
   840 	cp->player = (Owner)p->Recv_uint8();
   845 	cp->cmd    = NetworkRecv_uint32(cs, p);
   841 	cp->cmd    = p->Recv_uint32();
   846 	cp->p1     = NetworkRecv_uint32(cs, p);
   842 	cp->p1     = p->Recv_uint32();
   847 	cp->p2     = NetworkRecv_uint32(cs, p);
   843 	cp->p2     = p->Recv_uint32();
   848 	cp->tile   = NetworkRecv_uint32(cs, p);
   844 	cp->tile   = p->Recv_uint32();
   849 	NetworkRecv_string(cs, p, cp->text, lengthof(cp->text));
   845 	p->Recv_string(cp->text, lengthof(cp->text));
   850 
   846 
   851 	callback = NetworkRecv_uint8(cs, p);
   847 	callback = p->Recv_uint8();
   852 
   848 
   853 	if (cs->has_quit) return;
   849 	if (cs->has_quit) return;
   854 
   850 
   855 	ci = DEREF_CLIENT_INFO(cs);
   851 	ci = DEREF_CLIENT_INFO(cs);
   856 
   852 
   928 	// This packets means a client noticed an error and is reporting this
   924 	// This packets means a client noticed an error and is reporting this
   929 	//  to us. Display the error and report it to the other clients
   925 	//  to us. Display the error and report it to the other clients
   930 	NetworkTCPSocketHandler *new_cs;
   926 	NetworkTCPSocketHandler *new_cs;
   931 	char str[100];
   927 	char str[100];
   932 	char client_name[NETWORK_CLIENT_NAME_LENGTH];
   928 	char client_name[NETWORK_CLIENT_NAME_LENGTH];
   933 	NetworkErrorCode errorno = (NetworkErrorCode)NetworkRecv_uint8(cs, p);
   929 	NetworkErrorCode errorno = (NetworkErrorCode)p->Recv_uint8();
   934 
   930 
   935 	// The client was never joined.. thank the client for the packet, but ignore it
   931 	// The client was never joined.. thank the client for the packet, but ignore it
   936 	if (cs->status < STATUS_DONE_MAP || cs->has_quit) {
   932 	if (cs->status < STATUS_DONE_MAP || cs->has_quit) {
   937 		cs->has_quit = true;
   933 		cs->has_quit = true;
   938 		return;
   934 		return;
   967 	if (cs->status < STATUS_DONE_MAP || cs->has_quit) {
   963 	if (cs->status < STATUS_DONE_MAP || cs->has_quit) {
   968 		cs->has_quit = true;
   964 		cs->has_quit = true;
   969 		return;
   965 		return;
   970 	}
   966 	}
   971 
   967 
   972 	NetworkRecv_string(cs, p, str, lengthof(str));
   968 	p->Recv_string(str, lengthof(str));
   973 
   969 
   974 	NetworkGetClientName(client_name, sizeof(client_name), cs);
   970 	NetworkGetClientName(client_name, sizeof(client_name), cs);
   975 
   971 
   976 	NetworkTextMessage(NETWORK_ACTION_LEAVE, 1, false, client_name, "%s", str);
   972 	NetworkTextMessage(NETWORK_ACTION_LEAVE, 1, false, client_name, "%s", str);
   977 
   973 
   984 	cs->has_quit = true;
   980 	cs->has_quit = true;
   985 }
   981 }
   986 
   982 
   987 DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_ACK)
   983 DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_ACK)
   988 {
   984 {
   989 	uint32 frame = NetworkRecv_uint32(cs, p);
   985 	uint32 frame = p->Recv_uint32();
   990 
   986 
   991 	/* The client is trying to catch up with the server */
   987 	/* The client is trying to catch up with the server */
   992 	if (cs->status == STATUS_PRE_ACTIVE) {
   988 	if (cs->status == STATUS_PRE_ACTIVE) {
   993 		/* The client is not yet catched up? */
   989 		/* The client is not yet catched up? */
   994 		if (frame + DAY_TICKS < _frame_counter) return;
   990 		if (frame + DAY_TICKS < _frame_counter) return;
  1111 	}
  1107 	}
  1112 }
  1108 }
  1113 
  1109 
  1114 DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_CHAT)
  1110 DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_CHAT)
  1115 {
  1111 {
  1116 	NetworkAction action = (NetworkAction)NetworkRecv_uint8(cs, p);
  1112 	NetworkAction action = (NetworkAction)p->Recv_uint8();
  1117 	DestType desttype = (DestType)NetworkRecv_uint8(cs, p);
  1113 	DestType desttype = (DestType)p->Recv_uint8();
  1118 	int dest = NetworkRecv_uint8(cs, p);
  1114 	int dest = p->Recv_uint8();
  1119 	char msg[MAX_TEXT_MSG_LEN];
  1115 	char msg[MAX_TEXT_MSG_LEN];
  1120 
  1116 
  1121 	NetworkRecv_string(cs, p, msg, MAX_TEXT_MSG_LEN);
  1117 	p->Recv_string(msg, MAX_TEXT_MSG_LEN);
  1122 
  1118 
  1123 	NetworkServer_HandleChat(action, desttype, dest, msg, cs->index);
  1119 	NetworkServer_HandleChat(action, desttype, dest, msg, cs->index);
  1124 }
  1120 }
  1125 
  1121 
  1126 DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_SET_PASSWORD)
  1122 DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_SET_PASSWORD)
  1127 {
  1123 {
  1128 	char password[NETWORK_PASSWORD_LENGTH];
  1124 	char password[NETWORK_PASSWORD_LENGTH];
  1129 	const NetworkClientInfo *ci;
  1125 	const NetworkClientInfo *ci;
  1130 
  1126 
  1131 	NetworkRecv_string(cs, p, password, sizeof(password));
  1127 	p->Recv_string(password, sizeof(password));
  1132 	ci = DEREF_CLIENT_INFO(cs);
  1128 	ci = DEREF_CLIENT_INFO(cs);
  1133 
  1129 
  1134 	if (IsValidPlayer(ci->client_playas)) {
  1130 	if (IsValidPlayer(ci->client_playas)) {
  1135 		ttd_strlcpy(_network_player_info[ci->client_playas].password, password, sizeof(_network_player_info[0].password));
  1131 		ttd_strlcpy(_network_player_info[ci->client_playas].password, password, sizeof(_network_player_info[0].password));
  1136 	}
  1132 	}
  1139 DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_SET_NAME)
  1135 DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_SET_NAME)
  1140 {
  1136 {
  1141 	char client_name[NETWORK_CLIENT_NAME_LENGTH];
  1137 	char client_name[NETWORK_CLIENT_NAME_LENGTH];
  1142 	NetworkClientInfo *ci;
  1138 	NetworkClientInfo *ci;
  1143 
  1139 
  1144 	NetworkRecv_string(cs, p, client_name, sizeof(client_name));
  1140 	p->Recv_string(client_name, sizeof(client_name));
  1145 	ci = DEREF_CLIENT_INFO(cs);
  1141 	ci = DEREF_CLIENT_INFO(cs);
  1146 
  1142 
  1147 	if (cs->has_quit) return;
  1143 	if (cs->has_quit) return;
  1148 
  1144 
  1149 	if (ci != NULL) {
  1145 	if (ci != NULL) {
  1161 	char pass[NETWORK_PASSWORD_LENGTH];
  1157 	char pass[NETWORK_PASSWORD_LENGTH];
  1162 	char command[NETWORK_RCONCOMMAND_LENGTH];
  1158 	char command[NETWORK_RCONCOMMAND_LENGTH];
  1163 
  1159 
  1164 	if (_network_game_info.rcon_password[0] == '\0') return;
  1160 	if (_network_game_info.rcon_password[0] == '\0') return;
  1165 
  1161 
  1166 	NetworkRecv_string(cs, p, pass, sizeof(pass));
  1162 	p->Recv_string(pass, sizeof(pass));
  1167 	NetworkRecv_string(cs, p, command, sizeof(command));
  1163 	p->Recv_string(command, sizeof(command));
  1168 
  1164 
  1169 	if (strcmp(pass, _network_game_info.rcon_password) != 0) {
  1165 	if (strcmp(pass, _network_game_info.rcon_password) != 0) {
  1170 		DEBUG(net, 0, "[rcon] wrong password from client-id %d", cs->index);
  1166 		DEBUG(net, 0, "[rcon] wrong password from client-id %d", cs->index);
  1171 		return;
  1167 		return;
  1172 	}
  1168 	}
  1466 bool NetworkServer_ReadPackets(NetworkTCPSocketHandler *cs)
  1462 bool NetworkServer_ReadPackets(NetworkTCPSocketHandler *cs)
  1467 {
  1463 {
  1468 	Packet *p;
  1464 	Packet *p;
  1469 	NetworkRecvStatus res;
  1465 	NetworkRecvStatus res;
  1470 	while ((p = NetworkRecv_Packet(cs, &res)) != NULL) {
  1466 	while ((p = NetworkRecv_Packet(cs, &res)) != NULL) {
  1471 		byte type = NetworkRecv_uint8(cs, p);
  1467 		byte type = p->Recv_uint8();
  1472 		if (type < PACKET_END && _network_server_packet[type] != NULL && !cs->has_quit) {
  1468 		if (type < PACKET_END && _network_server_packet[type] != NULL && !cs->has_quit) {
  1473 			_network_server_packet[type](cs, p);
  1469 			_network_server_packet[type](cs, p);
  1474 		} else {
  1470 		} else {
  1475 			DEBUG(net, 0, "[server] received invalid packet type %d", type);
  1471 			DEBUG(net, 0, "[server] received invalid packet type %d", type);
  1476 		}
  1472 		}