From e7c66bb208d5243a41b889f9c0c01554c875b3e7 Mon Sep 17 00:00:00 2001 From: duncanspumpkin Date: Tue, 21 Mar 2017 19:05:53 +0000 Subject: [PATCH] Start adding network code --- src/openrct2/actions/GameAction.cpp | 10 ++++++++++ src/openrct2/actions/GameAction.h | 1 + src/openrct2/network/Network.cpp | 29 +++++++++++++++++++++++++++++ src/openrct2/network/NetworkTypes.h | 1 + src/openrct2/network/network.h | 5 +++++ 5 files changed, 46 insertions(+) diff --git a/src/openrct2/actions/GameAction.cpp b/src/openrct2/actions/GameAction.cpp index 2b348ba011..9b285564af 100644 --- a/src/openrct2/actions/GameAction.cpp +++ b/src/openrct2/actions/GameAction.cpp @@ -115,6 +115,16 @@ namespace GameActions GameActionResult result = Query(action); if (result.Error == GA_ERROR::OK) { + // Networked games send actions to the server to be run + if (network_get_mode() != NETWORK_MODE_NONE) + { + // Action has come from server. + if (!(actionFlags & GA_FLAGS::CLIENT_ONLY) && !(actionFlags & GA_FLAGS::GHOST)) + { + network_send_game_action(action); + } + } + // Execute the action, changing the game state result = action->Execute(); diff --git a/src/openrct2/actions/GameAction.h b/src/openrct2/actions/GameAction.h index 06fc908b8d..cee63174a6 100644 --- a/src/openrct2/actions/GameAction.h +++ b/src/openrct2/actions/GameAction.h @@ -48,6 +48,7 @@ namespace GA_FLAGS { constexpr uint16 ALLOW_WHILE_PAUSED = 1 << 0; constexpr uint16 CLIENT_ONLY = 1 << 1; + constexpr uint16 GHOST = 1 << 2; } /** diff --git a/src/openrct2/network/Network.cpp b/src/openrct2/network/Network.cpp index f41eac9b5c..3820ed7d19 100644 --- a/src/openrct2/network/Network.cpp +++ b/src/openrct2/network/Network.cpp @@ -40,6 +40,7 @@ sint32 _pickup_peep_old_x = SPRITE_LOCATION_NULL; #include #include +#include "../actions/GameAction.h" #include "../core/Console.hpp" #include "../core/FileStream.hpp" #include "../core/Json.hpp" @@ -1113,6 +1114,22 @@ 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) +{ + 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; + server_connection.QueuePacket(std::move(packet)); +} + +void Network::Server_Send_GAME_ACTION(const IGameAction * action) +{ + 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; + SendPacketToClients(*packet); +} + void Network::Server_Send_TICK() { last_tick_sent_time = platform_get_ticks(); @@ -2866,6 +2883,18 @@ void network_send_chat(const char* text) } } +void network_send_game_action(const IGameAction * action) +{ + switch (gNetwork.GetMode()) { + case NETWORK_MODE_SERVER: + gNetwork.Server_Send_GAME_ACTION(action); + break; + case NETWORK_MODE_CLIENT: + gNetwork.Client_Send_GAME_ACTION(action); + break; + } +} + void network_send_gamecmd(uint32 eax, uint32 ebx, uint32 ecx, uint32 edx, uint32 esi, uint32 edi, uint32 ebp, uint8 callback) { switch (gNetwork.GetMode()) { diff --git a/src/openrct2/network/NetworkTypes.h b/src/openrct2/network/NetworkTypes.h index 0f5e715315..b27bcd11c5 100644 --- a/src/openrct2/network/NetworkTypes.h +++ b/src/openrct2/network/NetworkTypes.h @@ -50,6 +50,7 @@ enum NETWORK_COMMAND NETWORK_COMMAND_EVENT, NETWORK_COMMAND_TOKEN, NETWORK_COMMAND_OBJECTS, + NETWORK_COMMAND_GAME_ACTION, NETWORK_COMMAND_MAX, NETWORK_COMMAND_INVALID = -1 }; diff --git a/src/openrct2/network/network.h b/src/openrct2/network/network.h index 677c321661..b6684ca6a6 100644 --- a/src/openrct2/network/network.h +++ b/src/openrct2/network/network.h @@ -141,6 +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 Server_Send_TICK(); void Server_Send_PLAYERLIST(); void Client_Send_PING(); @@ -320,6 +322,9 @@ 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_password(const char* password); void network_set_password(const char* password);