newnet: Fix corner case which resulted in updating before all messages had arrived. Make NET_FIREUP start the game before processing more messages (fixes case where one client is running under valgrind, or is just very very slow).

master
Cyp 2010-02-21 16:51:20 +01:00
parent 65196b0bd9
commit 36a6036b9f
3 changed files with 10 additions and 5 deletions

View File

@ -130,6 +130,8 @@ void gameTimeUpdate()
// Do not update the game time if gameTimeStop has been called
if (stopCount == 0)
{
bool mayUpdate = true;
// Calculate the new game time
uint32_t scaledCurrTime = (currTime - baseTime)*modifier + timeOffset;
if (scaledCurrTime < graphicsTime) // Make sure the clock doesn't step back at all.
@ -147,8 +149,9 @@ void gameTimeUpdate()
baseTime = currTime;
timeOffset = graphicsTime;
debug(LOG_NET, "Waiting for other players. gameTime = %u, player times are {%u, %u, %u, %u, %u, %u, %u, %u}", gameTime, gameQueueTime[0], gameQueueTime[1], gameQueueTime[2], gameQueueTime[3], gameQueueTime[4], gameQueueTime[5], gameQueueTime[6], gameQueueTime[7]);
//debug(LOG_NET, "Waiting for other players.");
debug(LOG_SYNC, "Waiting for other players. gameTime = %u, player times are {%u, %u, %u, %u, %u, %u, %u, %u}", gameTime, gameQueueTime[0], gameQueueTime[1], gameQueueTime[2], gameQueueTime[3], gameQueueTime[4], gameQueueTime[5], gameQueueTime[6], gameQueueTime[7]);
//debug(LOG_SYNC, "Waiting for other players.");
mayUpdate = false;
}
// Calculate the time for this frame
@ -157,7 +160,7 @@ void gameTimeUpdate()
// Adjust deltas.
if (sane)
{
if (scaledCurrTime >= gameTime)
if (scaledCurrTime >= gameTime && mayUpdate)
{
if (scaledCurrTime > gameTime + GAME_TICKS_PER_UPDATE)
{

View File

@ -3759,7 +3759,7 @@ void recvDebugSync(NETQUEUE queue)
debug(LOG_ERROR, "Inconsistent GAME_SYNC_DEBUG_STRING at gameTime %u. My version is: (%u lines)", syncDebugGameTime[rsyncDebugNext], syncDebugNum[rsyncDebugNext]);
for (i = 0; i < syncDebugNum[rsyncDebugNext]; ++i)
{
_debug(LOG_SYNC, syncDebugFunctions[rsyncDebugNext][i], "%s", syncDebugStrings[rsyncDebugNext][i]);
_debug(LOG_SYNC, syncDebugFunctions[rsyncDebugNext][i], "[%03u] %s", i, syncDebugStrings[rsyncDebugNext][i]);
free(syncDebugFunctions[rsyncDebugNext][i]);
free(syncDebugStrings[rsyncDebugNext][i]);
}

View File

@ -3031,8 +3031,10 @@ void frontendMultiMessages(void)
bMultiMessages = true;
changeTitleMode(STARTGAME);
bHosted = false;
break;
return; // Start the game before processing more messages.
}
ASSERT(false, "NET_FIREUP was received, but !ingame.localOptionsReceived.");
break;
case NET_KICK: // player is forcing someone to leave
{