1
0
mirror of https://github.com/OpenTTD/OpenTTD.git synced 2025-08-28 00:49:11 +00:00

(svn r19620) -Fix: desync when a command is received and in the queue while a client starts joining, i.e. save the game state. This can happen in two ways: with frame_freq > 1 a command received in a previous frame might not be executed yet or when a command is received in the same frame as the join but before the savegame is made. In both cases the joining client would not get all commands to get in-sync with the server (and the other clients).

This commit is contained in:
rubidium
2010-04-13 18:55:31 +00:00
parent d2ed777fa5
commit 088282bcf8
3 changed files with 20 additions and 0 deletions

View File

@@ -129,6 +129,24 @@ void NetworkSend_Command(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, Comma
SEND_COMMAND(PACKET_CLIENT_COMMAND)(&c);
}
/**
* Sync our local command queue to the command queue of the given
* socket. This is needed for the case where we receive a command
* before saving the game for a joining client, but without the
* execution of those commands. Not syncing those commands means
* that the client will never get them and as such will be in a
* desynced state from the time it started with joining.
* @param cs The client to sync the queue to.
*/
void NetworkSyncCommandQueue(NetworkClientSocket *cs)
{
for (CommandPacket *p = _local_command_queue; p != NULL; p = p->next) {
CommandPacket c = *p;
c.callback = 0;
NetworkAddCommandQueue(c, cs);
}
}
/**
* Execute all commands on the local command queue that ought to be executed this frame.
*/