diff --git a/src/openrct2/actions/GameAction.cpp b/src/openrct2/actions/GameAction.cpp index 9b285564af..0a0595b66a 100644 --- a/src/openrct2/actions/GameAction.cpp +++ b/src/openrct2/actions/GameAction.cpp @@ -16,6 +16,7 @@ #include "../core/Guard.hpp" #include "../core/Memory.hpp" +#include "../core/MemoryStream.h" #include "../core/Util.hpp" #include "../network/network.h" #include "GameAction.h" @@ -121,7 +122,10 @@ namespace GameActions // Action has come from server. if (!(actionFlags & GA_FLAGS::CLIENT_ONLY) && !(actionFlags & GA_FLAGS::GHOST)) { - network_send_game_action(action); + MemoryStream stream; + stream.WriteValue(action->GetFlags()); + action->Serialise(&stream); + network_send_game_action((uint8*)stream.GetData(), stream.GetLength(), 0); } } diff --git a/src/openrct2/network/Network.cpp b/src/openrct2/network/Network.cpp index 3820ed7d19..cb34d88347 100644 --- a/src/openrct2/network/Network.cpp +++ b/src/openrct2/network/Network.cpp @@ -99,6 +99,7 @@ Network::Network() client_command_handlers[NETWORK_COMMAND_MAP] = &Network::Client_Handle_MAP; client_command_handlers[NETWORK_COMMAND_CHAT] = &Network::Client_Handle_CHAT; client_command_handlers[NETWORK_COMMAND_GAMECMD] = &Network::Client_Handle_GAMECMD; + client_command_handlers[NETWORK_COMMAND_GAME_ACTION] = &Network::Client_Handle_GAME_ACTION; client_command_handlers[NETWORK_COMMAND_TICK] = &Network::Client_Handle_TICK; client_command_handlers[NETWORK_COMMAND_PLAYERLIST] = &Network::Client_Handle_PLAYERLIST; client_command_handlers[NETWORK_COMMAND_PING] = &Network::Client_Handle_PING; @@ -114,6 +115,7 @@ Network::Network() server_command_handlers[NETWORK_COMMAND_AUTH] = &Network::Server_Handle_AUTH; server_command_handlers[NETWORK_COMMAND_CHAT] = &Network::Server_Handle_CHAT; server_command_handlers[NETWORK_COMMAND_GAMECMD] = &Network::Server_Handle_GAMECMD; + server_command_handlers[NETWORK_COMMAND_GAME_ACTION] = &Network::Server_Handle_GAME_ACTION; 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; @@ -1114,19 +1116,19 @@ void Network::Server_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx SendPacketToClients(*packet, false, true); } -void Network::Client_Send_GAME_ACTION(const IGameAction * action) +void Network::Client_Send_GAME_ACTION(const uint8 * buffer, uint64 size, uint32 type) { std::unique_ptr packet(NetworkPacket::Allocate()); - *packet << (uint32)NETWORK_COMMAND_GAME_ACTION << (uint32)gCurrentTicks << eax << (ebx | GAME_COMMAND_FLAG_NETWORKED) - << ecx << edx << esi << edi << ebp << callback; + *packet << (uint32)NETWORK_COMMAND_GAME_ACTION << (uint32)gCurrentTicks << (uint32)type; + packet->Write(buffer, size); server_connection.QueuePacket(std::move(packet)); } -void Network::Server_Send_GAME_ACTION(const IGameAction * action) +void Network::Server_Send_GAME_ACTION(const uint8 * buffer, uint64 size, uint32 type) { std::unique_ptr packet(NetworkPacket::Allocate()); - *packet << (uint32)NETWORK_COMMAND_GAME_ACTION << (uint32)gCurrentTicks << eax << (ebx | GAME_COMMAND_FLAG_NETWORKED) - << ecx << edx << esi << edi << ebp << playerid << callback; + *packet << (uint32)NETWORK_COMMAND_GAME_ACTION << (uint32)gCurrentTicks << type; + packet->Write(buffer, size); SendPacketToClients(*packet); } @@ -2035,7 +2037,37 @@ void Network::Client_Handle_GAMECMD(NetworkConnection& connection, NetworkPacket GameCommand gc = GameCommand(tick, args, playerid, callback); game_command_queue.insert(gc); } +void Network::Client_Handle_GAME_ACTION(NetworkConnection& connection, NetworkPacket& packet) +{ + uint32 tick; + uint16 flags; + uint32 type; + money16 test; + packet >> tick >> type; + MemoryStream stream; + for (int i = packet.BytesRead; i < packet.Size; ++i) { + stream.WriteValue(((uint8*)packet.GetData())[i]); + } + stream.SetPosition(0); + flags = stream.ReadValue(); + test = stream.ReadValue(); +} +void Network::Server_Handle_GAME_ACTION(NetworkConnection& connection, NetworkPacket& packet) +{ + uint32 tick; + uint16 flags; + uint32 type; + money16 test; + packet >> tick >> type; + MemoryStream stream; + for (int i = packet.BytesRead; i < packet.Size; ++i) { + stream.WriteValue(((uint8*)packet.GetData())[i]); + } + stream.SetPosition(0); + flags = stream.ReadValue(); + test = stream.ReadValue(); +} void Network::Server_Handle_GAMECMD(NetworkConnection& connection, NetworkPacket& packet) { uint32 tick; @@ -2883,14 +2915,14 @@ void network_send_chat(const char* text) } } -void network_send_game_action(const IGameAction * action) +void network_send_game_action(const uint8 * buffer, uint64 size, uint32 type) { switch (gNetwork.GetMode()) { case NETWORK_MODE_SERVER: - gNetwork.Server_Send_GAME_ACTION(action); + gNetwork.Server_Send_GAME_ACTION(buffer, size, type); break; case NETWORK_MODE_CLIENT: - gNetwork.Client_Send_GAME_ACTION(action); + gNetwork.Client_Send_GAME_ACTION(buffer, size, type); break; } } diff --git a/src/openrct2/network/network.h b/src/openrct2/network/network.h index b6684ca6a6..6511d34fa8 100644 --- a/src/openrct2/network/network.h +++ b/src/openrct2/network/network.h @@ -141,8 +141,8 @@ public: void Server_Send_CHAT(const char* text); void Client_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp, uint8 callback); void Server_Send_GAMECMD(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp, uint8 playerid, uint8 callback); - void Client_Send_GAME_ACTION(const IGameAction * action); - void Server_Send_GAME_ACTION(const IGameAction * action); + void Client_Send_GAME_ACTION(const uint8 * buffer, uint64 size, uint32 type); + void Server_Send_GAME_ACTION(const uint8 * buffer, uint64 size, uint32 type); void Server_Send_TICK(); void Server_Send_PLAYERLIST(); void Client_Send_PING(); @@ -246,6 +246,8 @@ private: void Server_Handle_CHAT(NetworkConnection& connection, NetworkPacket& packet); void Client_Handle_GAMECMD(NetworkConnection& connection, NetworkPacket& packet); void Server_Handle_GAMECMD(NetworkConnection& connection, NetworkPacket& packet); + void Client_Handle_GAME_ACTION(NetworkConnection& connection, NetworkPacket& packet); + void Server_Handle_GAME_ACTION(NetworkConnection& connection, NetworkPacket& packet); void Client_Handle_TICK(NetworkConnection& connection, NetworkPacket& packet); void Client_Handle_PLAYERLIST(NetworkConnection& connection, NetworkPacket& packet); void Client_Handle_PING(NetworkConnection& connection, NetworkPacket& packet); @@ -322,9 +324,7 @@ sint32 network_get_pickup_peep_old_x(uint8 playerid); void network_send_map(); void network_send_chat(const char* text); void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp, uint8 callback); -#ifdef __cplusplus -void network_send_game_action(const IGameAction * action); -#endif +void network_send_game_action(const uint8 * buffer, uint64 size, uint32 type); void network_send_password(const char* password); void network_set_password(const char* password);