From 241ff111dd1fa01bb16eee754140abec5c615410 Mon Sep 17 00:00:00 2001 From: Matt Date: Sat, 25 Jul 2020 10:45:04 +0200 Subject: [PATCH] Address reviews --- data/language/en-GB.txt | 2 +- src/openrct2/localisation/StringIds.h | 1 + src/openrct2/network/Network.cpp | 50 +++++++++++++------------- src/openrct2/network/NetworkPacket.cpp | 2 +- src/openrct2/network/NetworkTypes.h | 2 +- 5 files changed, 29 insertions(+), 28 deletions(-) diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 99c653c904..c3e6366c05 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -3664,7 +3664,7 @@ STR_6374 :C STR_6375 :Unknown Ride STR_6376 :{WINDOW_COLOUR_2}Ride vehicle:{NEWLINE}{BLACK}{STRINGID} for {STRINGID} STR_6377 :{WINDOW_COLOUR_2}Type: {BLACK}{STRINGID} for {STRINGID} -STR_6378 :Receiving objects list {INT32} / {INT32} +STR_6378 :Receiving objects list: {INT32} / {INT32} ############# # Scenarios # diff --git a/src/openrct2/localisation/StringIds.h b/src/openrct2/localisation/StringIds.h index e9904014cd..bc79126dfd 100644 --- a/src/openrct2/localisation/StringIds.h +++ b/src/openrct2/localisation/StringIds.h @@ -3907,6 +3907,7 @@ enum STR_RESEARCH_TYPE_LABEL_VEHICLE = 6377, STR_MULTIPLAYER_RECEIVING_OBJECTS_LIST = 6378, + // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working /* MAX_STR_COUNT = 32768 */ // MAX_STR_COUNT - upper limit for number of strings, not the current count strings }; diff --git a/src/openrct2/network/Network.cpp b/src/openrct2/network/Network.cpp index f0010d0652..29f6cdc76a 100644 --- a/src/openrct2/network/Network.cpp +++ b/src/openrct2/network/Network.cpp @@ -360,7 +360,7 @@ Network::Network() server_command_handlers[NETWORK_COMMAND_PING] = &Network::Server_Handle_PING; server_command_handlers[NETWORK_COMMAND_GAMEINFO] = &Network::Server_Handle_GAMEINFO; server_command_handlers[NETWORK_COMMAND_TOKEN] = &Network::Server_Handle_TOKEN; - server_command_handlers[NETWORK_COMMAND_MAP_REQUEST] = &Network::Server_Handle_MAPREQUEST; + server_command_handlers[NETWORK_COMMAND_MAPREQUEST] = &Network::Server_Handle_MAPREQUEST; server_command_handlers[NETWORK_COMMAND_REQUEST_GAMESTATE] = &Network::Server_Handle_REQUEST_GAMESTATE; server_command_handlers[NETWORK_COMMAND_HEARTBEAT] = &Network::Server_Handle_HEARTBEAT; @@ -1468,7 +1468,7 @@ void Network::Client_Send_REQUESTMAP(const std::vector& objects) { log_verbose("client requests %u objects", uint32_t(objects.size())); std::unique_ptr packet(NetworkPacket::Allocate()); - *packet << static_cast(NETWORK_COMMAND_MAP_REQUEST) << static_cast(objects.size()); + *packet << static_cast(NETWORK_COMMAND_MAPREQUEST) << static_cast(objects.size()); for (const auto& object : objects) { log_verbose("client requests object %s", object.c_str()); @@ -1490,12 +1490,11 @@ void Network::Server_Send_OBJECTS_LIST( { log_verbose("Server sends objects list with %u items", objects.size()); - for (size_t i = 0; i < objects.size(); ++i) + bool startOfObjectList = true; + for (auto* object : objects) { - const auto* object = objects[i]; - std::unique_ptr packet(NetworkPacket::Allocate()); - *packet << static_cast(NETWORK_COMMAND_OBJECTS_LIST) << static_cast(i) + *packet << static_cast(NETWORK_COMMAND_OBJECTS_LIST) << startOfObjectList << static_cast(objects.size()); log_verbose("Object %.8s (checksum %x)", object->ObjectEntry.name, object->ObjectEntry.checksum); @@ -1503,6 +1502,7 @@ void Network::Server_Send_OBJECTS_LIST( *packet << object->ObjectEntry.checksum << object->ObjectEntry.flags; connection.QueuePacket(std::move(packet)); + startOfObjectList = false; } } @@ -2571,13 +2571,12 @@ void Network::Client_Handle_OBJECTS_LIST(NetworkConnection& connection, NetworkP { auto& repo = GetContext()->GetObjectRepository(); - uint32_t index = 0; + bool startOfObjectList = false; uint32_t totalObjects = 0; - packet >> index >> totalObjects; + packet >> startOfObjectList >> totalObjects; - if (index == 0) + if (startOfObjectList) { - // Start of objects list. _missingObjects.clear(); } @@ -2589,25 +2588,14 @@ void Network::Client_Handle_OBJECTS_LIST(NetworkConnection& connection, NetworkP return; } - char objectListMsg[256]; - uint32_t args[] = { - index + 1, - totalObjects, - }; - format_string(objectListMsg, 256, STR_MULTIPLAYER_RECEIVING_OBJECTS_LIST, &args); - - auto intent = Intent(WC_NETWORK_STATUS); - intent.putExtra(INTENT_EXTRA_MESSAGE, std::string{ objectListMsg }); - intent.putExtra(INTENT_EXTRA_CALLBACK, []() -> void { gNetwork.Close(); }); - context_open_intent(&intent); - - const char* name = reinterpret_cast(packet.Read(8)); + auto name = reinterpret_cast(packet.Read(8)); // Required, as packet has no null terminators. std::string s(name, name + 8); - uint32_t checksum, flags; + uint32_t checksum = 0; + uint32_t flags = 0; packet >> checksum >> flags; - const ObjectRepositoryItem* ori = repo.FindObject(s.c_str()); + const auto* ori = repo.FindObject(s.c_str()); // 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) @@ -2622,6 +2610,18 @@ void Network::Client_Handle_OBJECTS_LIST(NetworkConnection& connection, NetworkP ori->ObjectEntry.flags, checksum, flags); } + char objectListMsg[256]; + uint32_t args[] = { + static_cast(_missingObjects.size()), + totalObjects, + }; + format_string(objectListMsg, 256, STR_MULTIPLAYER_RECEIVING_OBJECTS_LIST, &args); + + auto intent = Intent(WC_NETWORK_STATUS); + intent.putExtra(INTENT_EXTRA_MESSAGE, std::string{ objectListMsg }); + intent.putExtra(INTENT_EXTRA_CALLBACK, []() -> void { gNetwork.Close(); }); + context_open_intent(&intent); + if (_missingObjects.size() == totalObjects) { log_verbose("client received object list, it has %u entries", totalObjects); diff --git a/src/openrct2/network/NetworkPacket.cpp b/src/openrct2/network/NetworkPacket.cpp index c82a711a53..ef4a7cd310 100644 --- a/src/openrct2/network/NetworkPacket.cpp +++ b/src/openrct2/network/NetworkPacket.cpp @@ -58,7 +58,7 @@ bool NetworkPacket::CommandRequiresAuth() case NETWORK_COMMAND_TOKEN: case NETWORK_COMMAND_GAMEINFO: case NETWORK_COMMAND_OBJECTS_LIST: - case NETWORK_COMMAND_MAP_REQUEST: + case NETWORK_COMMAND_MAPREQUEST: case NETWORK_COMMAND_HEARTBEAT: return false; default: diff --git a/src/openrct2/network/NetworkTypes.h b/src/openrct2/network/NetworkTypes.h index ad42b45992..68c1b96fa1 100644 --- a/src/openrct2/network/NetworkTypes.h +++ b/src/openrct2/network/NetworkTypes.h @@ -64,7 +64,7 @@ enum NETWORK_COMMAND NETWORK_COMMAND_EVENT, NETWORK_COMMAND_TOKEN, NETWORK_COMMAND_OBJECTS_LIST, - NETWORK_COMMAND_MAP_REQUEST, + NETWORK_COMMAND_MAPREQUEST, NETWORK_COMMAND_GAME_ACTION, NETWORK_COMMAND_PLAYERINFO, NETWORK_COMMAND_REQUEST_GAMESTATE,