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:
committed by
Michał Janiszewski
parent
e7c66bb208
commit
351b0df76b
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user