src/network/network_client.cpp
branchcustombridgeheads
changeset 5650 aefc131bf5ce
parent 5649 55c8267c933f
equal deleted inserted replaced
5649:55c8267c933f 5650:aefc131bf5ce
    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