mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-20 13:33:02 +01:00
Gamestate snapshots (#8819)
* Add initial interface. * Implement move operator in MemoryStream * Add pod array serialisation traits. * Add push_back with move semantics to CircularBuffer * Initial implementation of GameStateSnapshots * Add GameStateSnapshots to Context. * Add mp_desync console command. * Compare sprite data and fill change list. * Minor changes. * Proof of concept. * Calculate offset instead of using offsetof * Implement game state difference detection * Update mp_desync console command. * Fix identification of sprite remove/add. * Fix crash when only one peep in park when using mp_desync * Output state differences into user directory desync folder. * Add desync debugging as an option. * Add information to network status when a desync report was created. * Cast to proper type for %llu. * Update xcode project * Add more information to the diffed data. * Remove client-only relevant fields. * Cleanup. * Add better name output for misc sprites * Add srand0 and tick information to the output * Bump up network version * Cleanup * Set desync_debugging to false as default * Apply suggestions
This commit is contained in:
@@ -12,9 +12,11 @@
|
||||
#include "Context.h"
|
||||
#include "Editor.h"
|
||||
#include "Game.h"
|
||||
#include "GameStateSnapshots.h"
|
||||
#include "Input.h"
|
||||
#include "OpenRCT2.h"
|
||||
#include "ReplayManager.h"
|
||||
#include "config/Config.h"
|
||||
#include "interface/Screenshot.h"
|
||||
#include "localisation/Date.h"
|
||||
#include "localisation/Localisation.h"
|
||||
@@ -238,13 +240,30 @@ void GameState::UpdateLogic()
|
||||
|
||||
if (network_get_mode() == NETWORK_MODE_SERVER)
|
||||
{
|
||||
if (network_gamestate_snapshots_enabled())
|
||||
{
|
||||
CreateStateSnapshot();
|
||||
}
|
||||
|
||||
// Send current tick out.
|
||||
network_send_tick();
|
||||
}
|
||||
else if (network_get_mode() == NETWORK_MODE_CLIENT)
|
||||
{
|
||||
// Check desync.
|
||||
network_check_desynchronization();
|
||||
bool desynced = network_check_desynchronisation();
|
||||
if (desynced)
|
||||
{
|
||||
// If desync debugging is enabled and we are still connected request the specific game state from server.
|
||||
if (network_gamestate_snapshots_enabled() && network_get_status() == NETWORK_STATUS_CONNECTED)
|
||||
{
|
||||
// Create snapshot from this tick so we can compare it later
|
||||
// as we won't pause the game on this event.
|
||||
CreateStateSnapshot();
|
||||
|
||||
network_request_gamestate_snapshot();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
date_update();
|
||||
@@ -311,3 +330,12 @@ void GameState::UpdateLogic()
|
||||
gScenarioTicks++;
|
||||
gSavedAge++;
|
||||
}
|
||||
|
||||
void GameState::CreateStateSnapshot()
|
||||
{
|
||||
IGameStateSnapshots* snapshots = GetContext()->GetGameStateSnapshots();
|
||||
|
||||
auto& snapshot = snapshots->CreateSnapshot();
|
||||
snapshots->Capture(snapshot);
|
||||
snapshots->LinkSnapshot(snapshot, gCurrentTicks, scenario_rand_state().s0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user