From 0c23b0b3a400457754b2429e56c3e9a9dbaad1a4 Mon Sep 17 00:00:00 2001 From: rubidium Date: Tue, 7 Dec 2010 21:12:23 +0000 Subject: (svn r21429) -Fix [FS#3771]: the server didn't check for the paused state when allowing to execute commands --- src/network/network_command.cpp | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) (limited to 'src/network/network_command.cpp') diff --git a/src/network/network_command.cpp b/src/network/network_command.cpp index 91c4689e7..9af6bfca1 100644 --- a/src/network/network_command.cpp +++ b/src/network/network_command.cpp @@ -75,13 +75,21 @@ void CommandQueue::Append(CommandPacket *p) /** * Return the first item in the queue and remove it from the queue. + * @param ignore_paused Whether to ignore commands that may not be executed while paused. * @return the first item in the queue. */ -CommandPacket *CommandQueue::Pop() +CommandPacket *CommandQueue::Pop(bool ignore_paused) { + CommandPacket **prev = &this->first; CommandPacket *ret = this->first; + if (ignore_paused && _pause_mode != PM_UNPAUSED) { + while (ret != NULL && !IsCommandAllowedWhilePaused(ret->cmd)) { + prev = &ret->next; + ret = ret->next; + } + } if (ret != NULL) { - this->first = this->first->next; + *prev = ret->next; this->count--; } return ret; @@ -89,11 +97,17 @@ CommandPacket *CommandQueue::Pop() /** * Return the first item in the queue, but don't remove it. + * @param ignore_paused Whether to ignore commands that may not be executed while paused. * @return the first item in the queue. */ -CommandPacket *CommandQueue::Peek() +CommandPacket *CommandQueue::Peek(bool ignore_paused) { - return this->first; + if (!ignore_paused || _pause_mode == PM_UNPAUSED) return this->first; + + for (CommandPacket *p = this->first; p != NULL; p = p->next) { + if (IsCommandAllowedWhilePaused(p->cmd)) return p; + } + return NULL; } /** Free everything that is in the queue. */ @@ -251,7 +265,7 @@ static void DistributeQueue(CommandQueue *queue, const NetworkClientSocket *owne int to_go = _settings_client.network.commands_per_frame; CommandPacket *cp; - while (--to_go >= 0 && (cp = queue->Pop()) != NULL) { + while (--to_go >= 0 && (cp = queue->Pop(true)) != NULL) { DistributeCommandPacket(*cp, owner); free(cp); } -- cgit v1.2.3-54-g00ecf