From 65c6cd5412e607ab41f6a88f8e2f8e622e235cae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Tue, 18 Oct 2016 23:23:43 +0200 Subject: [PATCH] Implement review suggestions --- src/network/NetworkConnection.h | 2 +- src/network/network.cpp | 32 ++++++++++++++++++++------------ src/network/network.h | 2 +- src/rct2/S6Exporter.cpp | 2 +- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/network/NetworkConnection.h b/src/network/NetworkConnection.h index 982e8dd38e..87e9b2b09b 100644 --- a/src/network/NetworkConnection.h +++ b/src/network/NetworkConnection.h @@ -39,7 +39,7 @@ public: uint32 PingTime = 0; NetworkKey Key; std::vector Challenge; - std::vector RequestedObjects; + std::vector RequestedObjects; NetworkConnection(); ~NetworkConnection(); diff --git a/src/network/network.cpp b/src/network/network.cpp index 71853a38e6..8b31443b88 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -883,7 +883,7 @@ void Network::Server_Send_TOKEN(NetworkConnection& connection) connection.QueuePacket(std::move(packet)); } -void Network::Server_Send_OBJECTS(NetworkConnection& connection, rct_object_entry * object_list, uint32 size) +void Network::Server_Send_OBJECTS(NetworkConnection& connection, const rct_object_entry * object_list, uint32 size) const { log_verbose("Server sends objects list with %u items", size); std::unique_ptr packet(NetworkPacket::Allocate()); @@ -892,7 +892,7 @@ void Network::Server_Send_OBJECTS(NetworkConnection& connection, rct_object_entr { log_verbose("Object %.8s (checksum %x)", object_list[i].name, object_list[i].checksum); packet->Write((const uint8 *)object_list[i].name, 8); - *packet << object_list[i].checksum; + *packet << object_list[i].checksum << object_list[i].flags; } connection.QueuePacket(std::move(packet)); } @@ -1456,10 +1456,9 @@ void Network::Server_Client_Joined(const char* name, const std::string &keyhash, const char * player_name = (const char *) player->name.c_str(); format_string(text, 256, STR_MULTIPLAYER_PLAYER_HAS_JOINED_THE_GAME, &player_name); chat_history_add(text); - Server_Send_MAP(&connection); - gNetwork.Server_Send_EVENT_PLAYER_JOINED(player_name); - Server_Send_GROUPLIST(connection); - Server_Send_PLAYERLIST(); + rct_object_entry object_entries[OBJECT_ENTRY_COUNT]; + int count = scenario_get_num_packed_objects_to_write(object_entries); + Server_Send_OBJECTS(connection, object_entries, count); } } @@ -1470,9 +1469,6 @@ void Network::Server_Handle_TOKEN(NetworkConnection& connection, NetworkPacket& for (int i = 0; i < token_size; i++) { connection.Challenge[i] = (uint8)(rand() & 0xff); } - rct_object_entry object_entries[OBJECT_ENTRY_COUNT]; - int count = scenario_get_num_packed_objects_to_write(object_entries); - Server_Send_OBJECTS(connection, object_entries, count); Server_Send_TOKEN(connection); } @@ -1486,14 +1482,20 @@ void Network::Client_Handle_OBJECTS(NetworkConnection& connection, NetworkPacket for (uint32 i = 0; i < size; i++) { const char * name = (const char *)packet.Read(8); - uint32 checksum; - packet >> checksum; + // Required, as packet has no null terminators. std::string s(name, name + 8); + uint32 checksum, flags; + packet >> checksum >> flags; const ObjectRepositoryItem * ori = repo->FindObject(s.c_str()); - if (ori == nullptr || ori->ObjectEntry.checksum != checksum) { + // This could potentially request the object if checksums don't match, but since client + // won't replace its version with server-provided one, we don't do that. + if (ori == nullptr) { log_verbose("Requesting object %s with checksum %x from server", s.c_str(), checksum); requested_objects.push_back(s); + } else if (ori->ObjectEntry.checksum != checksum || ori->ObjectEntry.flags != flags) { + log_warning("Object %s has different checksum/flags (%x/%x) than server (%x/%x).", + s.c_str(), ori->ObjectEntry.checksum, ori->ObjectEntry.flags, checksum, flags); } } Client_Send_OBJECTS(requested_objects); @@ -1511,6 +1513,12 @@ void Network::Server_Handle_OBJECTS(NetworkConnection& connection, NetworkPacket log_verbose("Client requested object %s", s.c_str()); connection.RequestedObjects.push_back(s); } + + const char * player_name = (const char *) connection.Player->name.c_str(); + Server_Send_MAP(&connection); + gNetwork.Server_Send_EVENT_PLAYER_JOINED(player_name); + Server_Send_GROUPLIST(connection); + Server_Send_PLAYERLIST(); } void Network::Server_Handle_AUTH(NetworkConnection& connection, NetworkPacket& packet) diff --git a/src/network/network.h b/src/network/network.h index b9e932a5f0..c6cc8bcded 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -143,7 +143,7 @@ public: void Server_Send_EVENT_PLAYER_DISCONNECTED(const char *playerName, const char *reason); void Client_Send_GAMEINFO(); void Client_Send_OBJECTS(const std::vector &objects); - void Server_Send_OBJECTS(NetworkConnection& connection, rct_object_entry * object_list, uint32 size); + void Server_Send_OBJECTS(NetworkConnection& connection, const rct_object_entry *object_list, uint32 size) const; std::vector> player_list; std::vector> group_list; diff --git a/src/rct2/S6Exporter.cpp b/src/rct2/S6Exporter.cpp index 250afd39cf..2ccfc8e443 100644 --- a/src/rct2/S6Exporter.cpp +++ b/src/rct2/S6Exporter.cpp @@ -92,7 +92,7 @@ void S6Exporter::SaveScenario(SDL_RWops *rw) void S6Exporter::Save(SDL_RWops * rw, bool isScenario) { _s6.header.type = isScenario ? S6_TYPE_SCENARIO : S6_TYPE_SAVEDGAME; - _s6.header.num_packed_objects = !ExportObjects ? uint16(ExportObjectsList.size()) : scenario_get_num_packed_objects_to_write(nullptr); + _s6.header.num_packed_objects = ExportObjects ? scenario_get_num_packed_objects_to_write(nullptr) : uint16(ExportObjectsList.size()); _s6.header.version = S6_RCT2_VERSION; _s6.header.magic_number = S6_MAGIC_NUMBER;