From feef3d98da0909491d640a153cb4fb80c9e9387b Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Sat, 15 Apr 2017 07:43:42 +0100 Subject: [PATCH] Refactor packet handling --- src/openrct2/network/Network.cpp | 15 ++++++--------- src/openrct2/network/network.h | 8 +++++++- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/openrct2/network/Network.cpp b/src/openrct2/network/Network.cpp index 2819ce0cbd..39f04829c6 100644 --- a/src/openrct2/network/Network.cpp +++ b/src/openrct2/network/Network.cpp @@ -1363,7 +1363,6 @@ void Network::ProcessGameCommandQueue() IGameAction * action = GameActions::Create(gc.actionType); uint32 flags = gc.parameters->ReadValue(); action->Deserialise(gc.parameters); - delete gc.parameters; GameActionResult result = GameActions::Execute(action, flags | GAME_COMMAND_FLAG_NETWORKED); if (result.Error != GA_ERROR::OK) { @@ -2066,9 +2065,8 @@ void Network::Client_Handle_GAME_ACTION(NetworkConnection& connection, NetworkPa uint8 playerid; packet >> tick >> type >> playerid; MemoryStream stream; - for (size_t i = packet.BytesRead; i < packet.Size; ++i) { - stream.WriteValue(((uint8*)packet.GetData())[i]); - } + uint16 size = packet.Size - packet.BytesRead; + stream.WriteArray(packet.Read(size), size); stream.SetPosition(0); GameCommand gc = GameCommand(tick, type, stream, playerid); game_command_queue.insert(gc); @@ -2084,11 +2082,6 @@ void Network::Server_Handle_GAME_ACTION(NetworkConnection& connection, NetworkPa } packet >> tick >> commandType; - MemoryStream stream; - for (size_t i = packet.BytesRead; i < packet.Size; ++i) { - stream.WriteValue(((uint8*)packet.GetData())[i]); - } - stream.SetPosition(0); //tick count is different by time last_action_time is set, keep same value // Check if player's group permission allows command to run @@ -2137,6 +2130,10 @@ void Network::Server_Handle_GAME_ACTION(NetworkConnection& connection, NetworkPa game_command_playerid = connection.Player->Id; // Run game command, and if it is successful send to clients auto ga = GameActions::Create(commandType); + MemoryStream stream; + uint16 size = packet.Size - packet.BytesRead; + stream.WriteArray(packet.Read(size), size); + stream.SetPosition(0); uint32 flags = stream.ReadValue(); ga->Deserialise(&stream); auto result = GameActions::Execute(ga, GAME_COMMAND_FLAG_NETWORKED | flags); diff --git a/src/openrct2/network/network.h b/src/openrct2/network/network.h index f540cfabc0..b939e5f449 100644 --- a/src/openrct2/network/network.h +++ b/src/openrct2/network/network.h @@ -204,10 +204,16 @@ private: parameters = new MemoryStream(stream); } + ~GameCommand() + { + if (parameters != nullptr) + delete parameters; + } + uint32 tick; uint32 eax, ebx, ecx, edx, esi, edi, ebp; uint32 actionType = 0xFFFFFFFF; - MemoryStream *parameters; + MemoryStream *parameters = nullptr; uint8 playerid; uint8 callback; bool operator<(const GameCommand& comp) const {