1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2025-12-23 15:52:55 +01:00

Use real server tick to check desyncs.

This commit is contained in:
Matt
2019-03-12 14:22:31 +01:00
parent 57b8fba322
commit 7410c4b56c

View File

@@ -293,11 +293,9 @@ private:
std::unique_ptr<INetworkServerAdvertiser> _advertiser; std::unique_ptr<INetworkServerAdvertiser> _advertiser;
uint16_t listening_port = 0; uint16_t listening_port = 0;
SOCKET_STATUS _lastConnectStatus = SOCKET_STATUS_CLOSED; SOCKET_STATUS _lastConnectStatus = SOCKET_STATUS_CLOSED;
uint32_t last_tick_sent_time = 0;
uint32_t last_ping_sent_time = 0; uint32_t last_ping_sent_time = 0;
uint32_t server_tick = 0; uint32_t server_tick = 0;
uint32_t server_srand0 = 0; uint32_t server_srand0 = 0;
uint32_t server_srand0_tick = 0;
std::string server_sprite_hash; std::string server_sprite_hash;
uint8_t player_id = 0; uint8_t player_id = 0;
std::list<std::unique_ptr<NetworkConnection>> client_connection_list; std::list<std::unique_ptr<NetworkConnection>> client_connection_list;
@@ -307,7 +305,6 @@ private:
bool _desynchronised = false; bool _desynchronised = false;
uint32_t server_connect_time = 0; uint32_t server_connect_time = 0;
uint8_t default_group = 0; uint8_t default_group = 0;
uint32_t game_commands_processed_this_tick = 0;
uint32_t _commandId; uint32_t _commandId;
uint32_t _actionId; uint32_t _actionId;
std::string _chatLogPath; std::string _chatLogPath;
@@ -361,7 +358,6 @@ Network::Network()
wsa_initialized = false; wsa_initialized = false;
mode = NETWORK_MODE_NONE; mode = NETWORK_MODE_NONE;
status = NETWORK_STATUS_NONE; status = NETWORK_STATUS_NONE;
last_tick_sent_time = 0;
last_ping_sent_time = 0; last_ping_sent_time = 0;
_commandId = 0; _commandId = 0;
_actionId = 0; _actionId = 0;
@@ -926,24 +922,8 @@ void Network::SendPacketToClients(NetworkPacket& packet, bool front, bool gameCm
bool Network::CheckSRAND(uint32_t tick, uint32_t srand0) bool Network::CheckSRAND(uint32_t tick, uint32_t srand0)
{ {
if (server_srand0_tick == 0) if (tick == server_tick)
return true;
if (tick > server_srand0_tick)
{ {
server_srand0_tick = 0;
return true;
}
if (game_commands_processed_this_tick != 0)
{
// SRAND/sprite hash is only updated once at beginning of tick so it is invalid otherwise
return true;
}
if (tick == server_srand0_tick)
{
server_srand0_tick = 0;
// Check that the server and client sprite hashes match // Check that the server and client sprite hashes match
rct_sprite_checksum checksum = sprite_checksum(); rct_sprite_checksum checksum = sprite_checksum();
std::string client_sprite_hash = checksum.ToString(); std::string client_sprite_hash = checksum.ToString();
@@ -1618,14 +1598,6 @@ void Network::Server_Send_GAME_ACTION(const GameAction* action)
void Network::Server_Send_TICK() void Network::Server_Send_TICK()
{ {
uint32_t ticks = platform_get_ticks();
if (ticks < last_tick_sent_time + 25)
{
return;
}
last_tick_sent_time = ticks;
std::unique_ptr<NetworkPacket> packet(NetworkPacket::Allocate()); std::unique_ptr<NetworkPacket> packet(NetworkPacket::Allocate());
*packet << (uint32_t)NETWORK_COMMAND_TICK << gCurrentTicks << scenario_rand_state().s0; *packet << (uint32_t)NETWORK_COMMAND_TICK << gCurrentTicks << scenario_rand_state().s0;
uint32_t flags = 0; uint32_t flags = 0;
@@ -1924,7 +1896,6 @@ void Network::ProcessGameCommands()
GameActionResult::Ptr result = GameActions::Execute(action); GameActionResult::Ptr result = GameActions::Execute(action);
if (result->Error == GA_ERROR::OK) if (result->Error == GA_ERROR::OK)
{ {
game_commands_processed_this_tick++;
Server_Send_GAME_ACTION(action); Server_Send_GAME_ACTION(action);
} }
} }
@@ -1946,7 +1917,6 @@ void Network::ProcessGameCommands()
if (cost != MONEY32_UNDEFINED) if (cost != MONEY32_UNDEFINED)
{ {
game_commands_processed_this_tick++;
NetworkPlayer* player = GetPlayerByID(gc.playerid); NetworkPlayer* player = GetPlayerByID(gc.playerid);
if (!player) if (!player)
return; return;
@@ -2546,7 +2516,6 @@ void Network::Client_Handle_MAP([[maybe_unused]] NetworkConnection& connection,
game_load_init(); game_load_init();
game_command_queue.clear(); game_command_queue.clear();
server_tick = gCurrentTicks; server_tick = gCurrentTicks;
server_srand0_tick = 0;
// window_network_status_open("Loaded new map from network"); // window_network_status_open("Loaded new map from network");
_desynchronised = false; _desynchronised = false;
gFirstTimeSaving = true; gFirstTimeSaving = true;
@@ -2887,27 +2856,20 @@ void Network::Client_Handle_TICK([[maybe_unused]] NetworkConnection& connection,
{ {
uint32_t srand0; uint32_t srand0;
uint32_t flags; uint32_t flags;
// Note: older server version may not advertise flags at all.
// NetworkPacket will return 0, if trying to read past end of buffer,
// so flags == 0 is expected in such cases.
packet >> server_tick >> srand0 >> flags; packet >> server_tick >> srand0 >> flags;
if (server_srand0_tick == 0)
server_srand0 = srand0;
server_sprite_hash.resize(0);
if (flags & NETWORK_TICK_FLAG_CHECKSUMS)
{ {
server_srand0 = srand0; const char* text = packet.ReadString();
server_srand0_tick = server_tick; if (text != nullptr)
server_sprite_hash.resize(0);
if (flags & NETWORK_TICK_FLAG_CHECKSUMS)
{ {
const char* text = packet.ReadString(); auto textLen = std::strlen(text);
if (text != nullptr) server_sprite_hash.resize(textLen);
{ std::memcpy(server_sprite_hash.data(), text, textLen);
auto textLen = std::strlen(text);
server_sprite_hash.resize(textLen);
std::memcpy(server_sprite_hash.data(), text, textLen);
}
} }
} }
game_commands_processed_this_tick = 0;
} }
void Network::Client_Handle_PLAYERLIST([[maybe_unused]] NetworkConnection& connection, NetworkPacket& packet) void Network::Client_Handle_PLAYERLIST([[maybe_unused]] NetworkConnection& connection, NetworkPacket& packet)