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 |
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) |
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; |
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) |
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 |
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 } |
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 } |