18 #include "../command.h" |
18 #include "../command.h" |
19 #include "../window.h" |
19 #include "../window.h" |
20 #include "../console.h" |
20 #include "../console.h" |
21 #include "../variables.h" |
21 #include "../variables.h" |
22 #include "../ai/ai.h" |
22 #include "../ai/ai.h" |
23 |
23 #include "../helpers.hpp" |
24 |
24 |
25 // This file handles all the client-commands |
25 // This file handles all the client-commands |
26 |
26 |
27 |
27 |
28 // So we don't make too much typos ;) |
28 // So we don't make too much typos ;) |
284 |
284 |
285 company_info_version = NetworkRecv_uint8(MY_CLIENT, p); |
285 company_info_version = NetworkRecv_uint8(MY_CLIENT, p); |
286 |
286 |
287 if (!MY_CLIENT->has_quit && company_info_version == NETWORK_COMPANY_INFO_VERSION) { |
287 if (!MY_CLIENT->has_quit && company_info_version == NETWORK_COMPANY_INFO_VERSION) { |
288 byte total; |
288 byte total; |
289 byte current; |
289 PlayerID current; |
290 |
290 |
291 total = NetworkRecv_uint8(MY_CLIENT, p); |
291 total = NetworkRecv_uint8(MY_CLIENT, p); |
292 |
292 |
293 // There is no data at all.. |
293 // There is no data at all.. |
294 if (total == 0) return NETWORK_RECV_STATUS_CLOSE_QUERY; |
294 if (total == 0) return NETWORK_RECV_STATUS_CLOSE_QUERY; |
295 |
295 |
296 current = NetworkRecv_uint8(MY_CLIENT, p); |
296 current = (Owner)NetworkRecv_uint8(MY_CLIENT, p); |
297 if (!IsValidPlayer(current)) return NETWORK_RECV_STATUS_CLOSE_QUERY; |
297 if (!IsValidPlayer(current)) return NETWORK_RECV_STATUS_CLOSE_QUERY; |
298 |
298 |
299 NetworkRecv_string(MY_CLIENT, p, _network_player_info[current].company_name, sizeof(_network_player_info[current].company_name)); |
299 NetworkRecv_string(MY_CLIENT, p, _network_player_info[current].company_name, sizeof(_network_player_info[current].company_name)); |
300 _network_player_info[current].inaugurated_year = NetworkRecv_uint32(MY_CLIENT, p); |
300 _network_player_info[current].inaugurated_year = NetworkRecv_uint32(MY_CLIENT, p); |
301 _network_player_info[current].company_value = NetworkRecv_uint64(MY_CLIENT, p); |
301 _network_player_info[current].company_value = NetworkRecv_uint64(MY_CLIENT, p); |
323 // which is always an unique number on a server. |
323 // which is always an unique number on a server. |
324 DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_CLIENT_INFO) |
324 DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_CLIENT_INFO) |
325 { |
325 { |
326 NetworkClientInfo *ci; |
326 NetworkClientInfo *ci; |
327 uint16 index = NetworkRecv_uint16(MY_CLIENT, p); |
327 uint16 index = NetworkRecv_uint16(MY_CLIENT, p); |
328 PlayerID playas = NetworkRecv_uint8(MY_CLIENT, p); |
328 PlayerID playas = (Owner)NetworkRecv_uint8(MY_CLIENT, p); |
329 char name[NETWORK_NAME_LENGTH]; |
329 char name[NETWORK_NAME_LENGTH]; |
330 char unique_id[NETWORK_NAME_LENGTH]; |
330 char unique_id[NETWORK_NAME_LENGTH]; |
331 |
331 |
332 NetworkRecv_string(MY_CLIENT, p, name, sizeof(name)); |
332 NetworkRecv_string(MY_CLIENT, p, name, sizeof(name)); |
333 NetworkRecv_string(MY_CLIENT, p, unique_id, sizeof(unique_id)); |
333 NetworkRecv_string(MY_CLIENT, p, unique_id, sizeof(unique_id)); |
373 return NETWORK_RECV_STATUS_MALFORMED_PACKET; |
373 return NETWORK_RECV_STATUS_MALFORMED_PACKET; |
374 } |
374 } |
375 |
375 |
376 DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_ERROR) |
376 DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_ERROR) |
377 { |
377 { |
378 NetworkErrorCode error = NetworkRecv_uint8(MY_CLIENT, p); |
378 NetworkErrorCode error = (NetworkErrorCode)NetworkRecv_uint8(MY_CLIENT, p); |
379 |
379 |
380 switch (error) { |
380 switch (error) { |
381 /* We made an error in the protocol, and our connection is closed.... */ |
381 /* We made an error in the protocol, and our connection is closed.... */ |
382 case NETWORK_ERROR_NOT_AUTHORIZED: |
382 case NETWORK_ERROR_NOT_AUTHORIZED: |
383 case NETWORK_ERROR_NOT_EXPECTED: |
383 case NETWORK_ERROR_NOT_EXPECTED: |
408 return NETWORK_RECV_STATUS_SERVER_ERROR; |
408 return NETWORK_RECV_STATUS_SERVER_ERROR; |
409 } |
409 } |
410 |
410 |
411 DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_NEED_PASSWORD) |
411 DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_NEED_PASSWORD) |
412 { |
412 { |
413 NetworkPasswordType type = NetworkRecv_uint8(MY_CLIENT, p); |
413 NetworkPasswordType type = (NetworkPasswordType)NetworkRecv_uint8(MY_CLIENT, p); |
414 |
414 |
415 switch (type) { |
415 switch (type) { |
416 case NETWORK_GAME_PASSWORD: |
416 case NETWORK_GAME_PASSWORD: |
417 case NETWORK_COMPANY_PASSWORD: |
417 case NETWORK_COMPANY_PASSWORD: |
418 ShowNetworkNeedPassword(type); |
418 ShowNetworkNeedPassword(type); |
568 return NETWORK_RECV_STATUS_OKAY; |
568 return NETWORK_RECV_STATUS_OKAY; |
569 } |
569 } |
570 |
570 |
571 DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_COMMAND) |
571 DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_COMMAND) |
572 { |
572 { |
573 CommandPacket *cp = malloc(sizeof(CommandPacket)); |
573 CommandPacket *cp; |
574 cp->player = NetworkRecv_uint8(MY_CLIENT, p); |
574 MallocT(&cp, 1); |
|
575 cp->player = (PlayerID)NetworkRecv_uint8(MY_CLIENT, p); |
575 cp->cmd = NetworkRecv_uint32(MY_CLIENT, p); |
576 cp->cmd = NetworkRecv_uint32(MY_CLIENT, p); |
576 cp->p1 = NetworkRecv_uint32(MY_CLIENT, p); |
577 cp->p1 = NetworkRecv_uint32(MY_CLIENT, p); |
577 cp->p2 = NetworkRecv_uint32(MY_CLIENT, p); |
578 cp->p2 = NetworkRecv_uint32(MY_CLIENT, p); |
578 cp->tile = NetworkRecv_uint32(MY_CLIENT, p); |
579 cp->tile = NetworkRecv_uint32(MY_CLIENT, p); |
579 NetworkRecv_string(MY_CLIENT, p, cp->text, sizeof(cp->text)); |
580 NetworkRecv_string(MY_CLIENT, p, cp->text, sizeof(cp->text)); |
599 DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_CHAT) |
600 DEF_CLIENT_RECEIVE_COMMAND(PACKET_SERVER_CHAT) |
600 { |
601 { |
601 char name[NETWORK_NAME_LENGTH], msg[MAX_TEXT_MSG_LEN]; |
602 char name[NETWORK_NAME_LENGTH], msg[MAX_TEXT_MSG_LEN]; |
602 const NetworkClientInfo *ci = NULL, *ci_to; |
603 const NetworkClientInfo *ci = NULL, *ci_to; |
603 |
604 |
604 NetworkAction action = NetworkRecv_uint8(MY_CLIENT, p); |
605 NetworkAction action = (NetworkAction)NetworkRecv_uint8(MY_CLIENT, p); |
605 uint16 index = NetworkRecv_uint16(MY_CLIENT, p); |
606 uint16 index = NetworkRecv_uint16(MY_CLIENT, p); |
606 bool self_send = NetworkRecv_uint8(MY_CLIENT, p); |
607 bool self_send = (NetworkRecv_uint8(MY_CLIENT, p) != 0); |
607 NetworkRecv_string(MY_CLIENT, p, msg, MAX_TEXT_MSG_LEN); |
608 NetworkRecv_string(MY_CLIENT, p, msg, MAX_TEXT_MSG_LEN); |
608 |
609 |
609 ci_to = NetworkFindClientInfoFromIndex(index); |
610 ci_to = NetworkFindClientInfoFromIndex(index); |
610 if (ci_to == NULL) return NETWORK_RECV_STATUS_OKAY; |
611 if (ci_to == NULL) return NETWORK_RECV_STATUS_OKAY; |
611 |
612 |
621 /* For speaking to company or giving money, we need the player-name */ |
622 /* For speaking to company or giving money, we need the player-name */ |
622 case NETWORK_ACTION_GIVE_MONEY: |
623 case NETWORK_ACTION_GIVE_MONEY: |
623 if (!IsValidPlayer(ci_to->client_playas)) return NETWORK_RECV_STATUS_OKAY; |
624 if (!IsValidPlayer(ci_to->client_playas)) return NETWORK_RECV_STATUS_OKAY; |
624 /* fallthrough */ |
625 /* fallthrough */ |
625 case NETWORK_ACTION_CHAT_COMPANY: { |
626 case NETWORK_ACTION_CHAT_COMPANY: { |
626 StringID str = IsValidPlayer(ci_to->client_playas) ? GetPlayer(ci_to->client_playas)->name_1 : STR_NETWORK_SPECTATORS; |
627 StringID str = IsValidPlayer(ci_to->client_playas) ? GetPlayer(ci_to->client_playas)->name_1 : (uint16)STR_NETWORK_SPECTATORS; |
627 |
628 |
628 GetString(name, str, lastof(name)); |
629 GetString(name, str, lastof(name)); |
629 ci = NetworkFindClientInfoFromIndex(_network_own_client_index); |
630 ci = NetworkFindClientInfoFromIndex(_network_own_client_index); |
630 } break; |
631 } break; |
631 |
632 |
647 char str[100]; |
648 char str[100]; |
648 uint16 index; |
649 uint16 index; |
649 NetworkClientInfo *ci; |
650 NetworkClientInfo *ci; |
650 |
651 |
651 index = NetworkRecv_uint16(MY_CLIENT, p); |
652 index = NetworkRecv_uint16(MY_CLIENT, p); |
652 GetNetworkErrorMsg(str, NetworkRecv_uint8(MY_CLIENT, p), lastof(str)); |
653 GetNetworkErrorMsg(str, (NetworkErrorCode)NetworkRecv_uint8(MY_CLIENT, p), lastof(str)); |
653 |
654 |
654 ci = NetworkFindClientInfoFromIndex(index); |
655 ci = NetworkFindClientInfoFromIndex(index); |
655 if (ci != NULL) { |
656 if (ci != NULL) { |
656 NetworkTextMessage(NETWORK_ACTION_LEAVE, 1, false, ci->client_name, "%s", str); |
657 NetworkTextMessage(NETWORK_ACTION_LEAVE, 1, false, ci->client_name, "%s", str); |
657 |
658 |