diff options
Diffstat (limited to 'network_server.c')
-rw-r--r-- | network_server.c | 131 |
1 files changed, 60 insertions, 71 deletions
diff --git a/network_server.c b/network_server.c index 1ac9ce56a..4ad123056 100644 --- a/network_server.c +++ b/network_server.c @@ -43,10 +43,8 @@ DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_CLIENT_INFO)(NetworkClientState *cs, // String: The unique id of the client // - Packet *p; - if (ci->client_index != NETWORK_EMPTY_INDEX) { - p = NetworkSend_Init(PACKET_SERVER_CLIENT_INFO); + Packet *p = NetworkSend_Init(PACKET_SERVER_CLIENT_INFO); NetworkSend_uint16(p, ci->client_index); NetworkSend_uint8 (p, ci->client_playas); NetworkSend_string(p, ci->client_name); @@ -72,7 +70,7 @@ DEF_SERVER_SEND_COMMAND(PACKET_SERVER_COMPANY_INFO) byte active = ActivePlayerCount(); if (active == 0) { - Packet *p = NetworkSend_Init(PACKET_SERVER_COMPANY_INFO); + p = NetworkSend_Init(PACKET_SERVER_COMPANY_INFO); NetworkSend_uint8 (p, NETWORK_COMPANY_INFO_VERSION); NetworkSend_uint8 (p, active); @@ -140,10 +138,7 @@ DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_ERROR)(NetworkClientState *cs, Netwo // uint8: ErrorID (see network_data.h, NetworkErrorCode) // - NetworkClientState *new_cs; char str[100]; - char client_name[NETWORK_CLIENT_NAME_LENGTH]; - Packet *p = NetworkSend_Init(PACKET_SERVER_ERROR); NetworkSend_uint8(p, error); @@ -153,6 +148,9 @@ DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_ERROR)(NetworkClientState *cs, Netwo // Only send when the current client was in game if (cs->status > STATUS_AUTH) { + NetworkClientState *new_cs; + char client_name[NETWORK_CLIENT_NAME_LENGTH]; + NetworkGetClientName(client_name, sizeof(client_name), cs); DEBUG(net, 2) ("[NET] '%s' made an error and has been disconnected. Reason: %s", client_name, str); @@ -173,7 +171,7 @@ DEF_SERVER_SEND_COMMAND_PARAM(PACKET_SERVER_ERROR)(NetworkClientState *cs, Netwo DEBUG(net, 2) ("[NET] Client %d made an error and has been disconnected. Reason: %s", cs->index, str); } - cs->quited = true; + cs->has_quit = true; // Make sure the data get's there before we close the connection NetworkSend_Packets(cs); @@ -269,7 +267,6 @@ DEF_SERVER_SEND_COMMAND(PACKET_SERVER_MAP) // last 2 are repeated MAX_PLAYERS time // - char filename[256]; static FILE *file_pointer; static uint sent_packets; // How many packets we did send succecfully last time @@ -278,7 +275,9 @@ DEF_SERVER_SEND_COMMAND(PACKET_SERVER_MAP) SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_AUTHORIZED); return; } + if (cs->status == STATUS_AUTH) { + char filename[256]; Packet *p; // Make a dump of the current game @@ -312,9 +311,9 @@ DEF_SERVER_SEND_COMMAND(PACKET_SERVER_MAP) Packet *p = NetworkSend_Init(PACKET_SERVER_MAP); NetworkSend_uint8(p, MAP_PACKET_NORMAL); res = (int)fread(p->buffer + p->size, 1, SEND_MTU - p->size, file_pointer); - if (ferror(file_pointer)) { - error("Error reading temporary network savegame!"); - } + + if (ferror(file_pointer)) error("Error reading temporary network savegame!"); + p->size += res; NetworkSend_Packet(p, cs); if (feof(file_pointer)) { @@ -592,7 +591,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_JOIN) client_lang = NetworkRecv_uint8(cs, p); NetworkRecv_string(cs, p, unique_id, sizeof(unique_id)); - if (cs->quited) return; + if (cs->has_quit) return; // join another company does not affect these values switch (playas) { @@ -652,7 +651,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_PASSWORD) { NetworkPasswordType type; char password[NETWORK_PASSWORD_LENGTH]; - NetworkClientInfo *ci; + const NetworkClientInfo *ci; type = NetworkRecv_uint8(cs, p); NetworkRecv_string(cs, p, password, sizeof(password)); @@ -695,11 +694,11 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_PASSWORD) DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_GETMAP) { - NetworkClientState *new_cs; + const NetworkClientState *new_cs; // The client was never joined.. so this is impossible, right? // Ignore the packet, give the client a warning, and close his connection - if (cs->status < STATUS_AUTH || cs->quited) { + if (cs->status < STATUS_AUTH || cs->has_quit) { SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_AUTHORIZED); return; } @@ -721,7 +720,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_GETMAP) DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_MAP_OK) { // Client has the map, now start syncing - if (cs->status == STATUS_DONE_MAP && !cs->quited) { + if (cs->status == STATUS_DONE_MAP && !cs->has_quit) { char client_name[NETWORK_CLIENT_NAME_LENGTH]; NetworkClientState *new_cs; @@ -778,6 +777,7 @@ static bool CheckCommandFlags(const CommandPacket *cp, const NetworkClientInfo * IConsolePrintF(_icolour_err, "WARNING: offline only command from client %d (IP: %s), kicking...", ci->client_index, GetPlayerIP(ci)); return false; } + return true; } @@ -795,7 +795,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMMAND) // The client was never joined.. so this is impossible, right? // Ignore the packet, give the client a warning, and close his connection - if (cs->status < STATUS_DONE_MAP || cs->quited) { + if (cs->status < STATUS_DONE_MAP || cs->has_quit) { SEND_COMMAND(PACKET_SERVER_ERROR)(cs, NETWORK_ERROR_NOT_EXPECTED); return; } @@ -809,7 +809,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMMAND) callback = NetworkRecv_uint8(cs, p); - if (cs->quited) return; + if (cs->has_quit) return; ci = DEREF_CLIENT_INFO(cs); @@ -847,9 +847,11 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMMAND) return; } - // XXX - UGLY! p2 is mis-used to get the client-id in CmdPlayerCtrl + /* XXX - Execute the command as a valid player. Normally this would be done by a + * spectator, but that is not allowed any commands. So do an impersonation. The drawback + * of this is that the first company's last_built_tile is also updated... */ cp->player = 0; - cp->p2 = cs - _clients; + cp->p2 = cs - _clients; // XXX - UGLY! p2 is mis-used to get the client-id in CmdPlayerCtrl } // The frame can be executed in the same frame as the next frame-packet @@ -886,12 +888,12 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_ERROR) // to us. Display the error and report it to the other clients NetworkClientState *new_cs; char str[100]; - NetworkErrorCode errorno = NetworkRecv_uint8(cs, p); char client_name[NETWORK_CLIENT_NAME_LENGTH]; + NetworkErrorCode errorno = NetworkRecv_uint8(cs, p); // The client was never joined.. thank the client for the packet, but ignore it - if (cs->status < STATUS_DONE_MAP || cs->quited) { - cs->quited = true; + if (cs->status < STATUS_DONE_MAP || cs->has_quit) { + cs->has_quit = true; return; } @@ -909,7 +911,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_ERROR) } } - cs->quited = true; + cs->has_quit = true; } DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_QUIT) @@ -921,8 +923,8 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_QUIT) char client_name[NETWORK_CLIENT_NAME_LENGTH]; // The client was never joined.. thank the client for the packet, but ignore it - if (cs->status < STATUS_DONE_MAP || cs->quited) { - cs->quited = true; + if (cs->status < STATUS_DONE_MAP || cs->has_quit) { + cs->has_quit = true; return; } @@ -938,7 +940,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_QUIT) } } - cs->quited = true; + cs->has_quit = true; } DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_ACK) @@ -948,8 +950,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_ACK) /* The client is trying to catch up with the server */ if (cs->status == STATUS_PRE_ACTIVE) { /* The client is not yet catched up? */ - if (frame + DAY_TICKS < _frame_counter) - return; + if (frame + DAY_TICKS < _frame_counter) return; /* Now he is! Unpause the game */ cs->status = STATUS_ACTIVE; @@ -976,7 +977,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_ACK) void NetworkServer_HandleChat(NetworkAction action, DestType desttype, int dest, const char *msg, uint16 from_index) { NetworkClientState *cs; - NetworkClientInfo *ci, *ci_own, *ci_to; + const NetworkClientInfo *ci, *ci_own, *ci_to; switch (desttype) { case DESTTYPE_CLIENT: @@ -1022,9 +1023,7 @@ void NetworkServer_HandleChat(NetworkAction action, DestType desttype, int dest, ci = DEREF_CLIENT_INFO(cs); if (ci->client_playas == dest) { SEND_COMMAND(PACKET_SERVER_CHAT)(cs, action, from_index, false, msg); - if (cs->index == from_index) { - show_local = false; - } + if (cs->index == from_index) show_local = false; ci_to = ci; // Remember a client that is in the company for company-name } } @@ -1033,8 +1032,7 @@ void NetworkServer_HandleChat(NetworkAction action, DestType desttype, int dest, ci_own = NetworkFindClientInfoFromIndex(NETWORK_SERVER_INDEX); if (ci != NULL && ci_own != NULL && ci_own->client_playas == dest) { NetworkTextMessage(action, GetDrawStringPlayerColor(ci->client_playas), false, ci->client_name, "%s", msg); - if (from_index == NETWORK_SERVER_INDEX) - show_local = false; + if (from_index == NETWORK_SERVER_INDEX) show_local = false; ci_to = ci_own; } @@ -1086,7 +1084,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_CHAT) DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_SET_PASSWORD) { char password[NETWORK_PASSWORD_LENGTH]; - NetworkClientInfo *ci; + const NetworkClientInfo *ci; NetworkRecv_string(cs, p, password, sizeof(password)); ci = DEREF_CLIENT_INFO(cs); @@ -1104,8 +1102,7 @@ DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_SET_NAME) NetworkRecv_string(cs, p, client_name, sizeof(client_name)); ci = DEREF_CLIENT_INFO(cs); - if (cs->quited) - return; + if (cs->has_quit) return; if (ci != NULL) { // Display change @@ -1190,12 +1187,12 @@ assert_compile(lengthof(_network_server_packet) == PACKET_END); void NetworkPopulateCompanyInfo(void) { char password[NETWORK_PASSWORD_LENGTH]; - Player *p; - Vehicle *v; - Station *s; - NetworkClientState *cs; - NetworkClientInfo *ci; - int i; + const Player *p; + const Vehicle *v; + const Station *s; + const NetworkClientState *cs; + const NetworkClientInfo *ci; + uint i; uint16 months_empty; FOR_ALL_PLAYERS(p) { @@ -1219,11 +1216,11 @@ void NetworkPopulateCompanyInfo(void) // Check the income if (_cur_year - 1 == p->inaugurated_year) { // The player is here just 1 year, so display [2], else display[1] - for (i = 0; i < 13; i++) { + for (i = 0; i < lengthof(p->yearly_expenses[2]); i++) { _network_player_info[p->index].income -= p->yearly_expenses[2][i]; } } else { - for (i = 0; i < 13; i++) { + for (i = 0; i < lengthof(p->yearly_expenses[1]); i++) { _network_player_info[p->index].income -= p->yearly_expenses[1][i]; } } @@ -1238,11 +1235,10 @@ void NetworkPopulateCompanyInfo(void) // Go through all vehicles and count the type of vehicles FOR_ALL_VEHICLES(v) { if (!IsValidPlayer(v->owner)) continue; + switch (v->type) { case VEH_Train: - if (IsFrontEngine(v)) { - _network_player_info[v->owner].num_vehicle[0]++; - } + if (IsFrontEngine(v)) _network_player_info[v->owner].num_vehicle[0]++; break; case VEH_Road: @@ -1254,9 +1250,7 @@ void NetworkPopulateCompanyInfo(void) break; case VEH_Aircraft: - if (v->subtype <= 2) { - _network_player_info[v->owner].num_vehicle[3]++; - } + if (v->subtype <= 2) _network_player_info[v->owner].num_vehicle[3]++; break; case VEH_Ship: @@ -1272,7 +1266,7 @@ void NetworkPopulateCompanyInfo(void) // Go through all stations and count the types of stations FOR_ALL_STATIONS(s) { if (IsValidPlayer(s->owner)) { - NetworkPlayerInfo* npi = &_network_player_info[s->owner]; + NetworkPlayerInfo *npi = &_network_player_info[s->owner]; if (s->facilities & FACIL_TRAIN) npi->num_station[0]++; if (s->facilities & FACIL_TRUCK_STOP) npi->num_station[1]++; @@ -1306,9 +1300,7 @@ void NetworkPopulateCompanyInfo(void) void NetworkUpdateClientInfo(uint16 client_index) { NetworkClientState *cs; - NetworkClientInfo *ci; - - ci = NetworkFindClientInfoFromIndex(client_index); + NetworkClientInfo *ci = NetworkFindClientInfoFromIndex(client_index); if (ci == NULL) return; @@ -1334,9 +1326,9 @@ static void NetworkCheckRestartMap(void) (and item 1. happens a year later) */ static void NetworkAutoCleanCompanies(void) { - NetworkClientState *cs; - NetworkClientInfo *ci; - Player *p; + const NetworkClientState *cs; + const NetworkClientInfo *ci; + const Player *p; bool clients_in_company[MAX_PLAYERS]; if (!_network_autoclean_companies) return; @@ -1348,6 +1340,7 @@ static void NetworkAutoCleanCompanies(void) ci = DEREF_CLIENT_INFO(cs); if (IsValidPlayer(ci->client_playas)) clients_in_company[ci->client_playas] = true; } + if (!_network_dedicated) { ci = NetworkFindClientInfoFromIndex(NETWORK_SERVER_INDEX); if (IsValidPlayer(ci->client_playas)) clients_in_company[ci->client_playas] = true; @@ -1366,7 +1359,7 @@ static void NetworkAutoCleanCompanies(void) if (_network_player_info[p->index].months_empty > _network_autoclean_unprotected && _network_player_info[p->index].password[0] == '\0') { /* Shut the company down */ DoCommandP(0, 2, p->index, NULL, CMD_PLAYER_CTRL); - IConsolePrintF(_icolour_def, "Auto-cleaned company #%d", p->index+1); + IConsolePrintF(_icolour_def, "Auto-cleaned company #%d", p->index + 1); } /* Is the compnay empty for autoclean_protected-months, and there is a protection? */ if (_network_player_info[p->index].months_empty > _network_autoclean_protected && _network_player_info[p->index].password[0] != '\0') { @@ -1387,7 +1380,6 @@ static void NetworkAutoCleanCompanies(void) bool NetworkFindName(char new_name[NETWORK_CLIENT_NAME_LENGTH]) { NetworkClientState *new_cs; - NetworkClientInfo *ci; bool found_name = false; byte number = 0; char original_name[NETWORK_CLIENT_NAME_LENGTH]; @@ -1396,6 +1388,8 @@ bool NetworkFindName(char new_name[NETWORK_CLIENT_NAME_LENGTH]) ttd_strlcpy(original_name, new_name, NETWORK_CLIENT_NAME_LENGTH); while (!found_name) { + const NetworkClientInfo *ci; + found_name = true; FOR_ALL_CLIENTS(new_cs) { ci = DEREF_CLIENT_INFO(new_cs); @@ -1408,10 +1402,7 @@ bool NetworkFindName(char new_name[NETWORK_CLIENT_NAME_LENGTH]) // Check if it is the same as the server-name ci = NetworkFindClientInfoFromIndex(NETWORK_SERVER_INDEX); if (ci != NULL) { - if (strcmp(ci->client_name, new_name) == 0) { - // Name already in use - found_name = false; - } + if (strcmp(ci->client_name, new_name) == 0) found_name = false; // name already in use } if (!found_name) { @@ -1433,7 +1424,7 @@ bool NetworkServer_ReadPackets(NetworkClientState *cs) NetworkRecvStatus res; while ((p = NetworkRecv_Packet(cs, &res)) != NULL) { byte type = NetworkRecv_uint8(cs, p); - if (type < PACKET_END && _network_server_packet[type] != NULL && !cs->quited) { + if (type < PACKET_END && _network_server_packet[type] != NULL && !cs->has_quit) { _network_server_packet[type](cs, p); } else { DEBUG(net, 0)("[NET][Server] Received invalid packet type %d", type); @@ -1509,13 +1500,11 @@ void NetworkServer_Tick(bool send_frame) NetworkHandleCommandQueue(cs); // Send an updated _frame_counter_max to the client - if (send_frame) - SEND_COMMAND(PACKET_SERVER_FRAME)(cs); + if (send_frame) SEND_COMMAND(PACKET_SERVER_FRAME)(cs); #ifndef ENABLE_NETWORK_SYNC_EVERY_FRAME // Send a sync-check packet - if (send_sync) - SEND_COMMAND(PACKET_SERVER_SYNC)(cs); + if (send_sync) SEND_COMMAND(PACKET_SERVER_SYNC)(cs); #endif } } |