1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-19 13:03:11 +01:00

Initial try at adding networking

This commit is contained in:
duncanspumpkin
2017-03-23 19:49:19 +00:00
committed by Michał Janiszewski
parent e7c66bb208
commit 351b0df76b
3 changed files with 51 additions and 15 deletions

View File

@@ -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);
}
}

View File

@@ -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<NetworkPacket> 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<NetworkPacket> 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<uint16>();
test = stream.ReadValue<money16>();
}
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<uint16>();
test = stream.ReadValue<money16>();
}
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;
}
}

View File

@@ -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);