mirror of
https://github.com/JGRennison/OpenTTD-patches.git
synced 2024-11-11 13:10:45 +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:
parent
36c1cf6129
commit
34cdcaf8b2
@ -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.
|
||||
*/
|
||||
|
@ -163,6 +163,7 @@ struct CommandPacket : CommandContainer {
|
||||
void NetworkAddCommandQueue(CommandPacket cp, NetworkClientSocket *cs = NULL);
|
||||
void NetworkExecuteLocalCommandQueue();
|
||||
void NetworkFreeLocalCommandQueue();
|
||||
void NetworkSyncCommandQueue(NetworkClientSocket *cs);
|
||||
|
||||
/* from network.c */
|
||||
NetworkRecvStatus NetworkCloseClient(NetworkClientSocket *cs, NetworkRecvStatus status);
|
||||
|
@ -353,6 +353,7 @@ DEF_SERVER_SEND_COMMAND(PACKET_SERVER_MAP)
|
||||
|
||||
sent_packets = 4; // We start with trying 4 packets
|
||||
|
||||
NetworkSyncCommandQueue(cs);
|
||||
cs->status = STATUS_MAP;
|
||||
/* Mark the start of download */
|
||||
cs->last_frame = _frame_counter;
|
||||
|
Loading…
Reference in New Issue
Block a user