diff options
author | rubidium <rubidium@openttd.org> | 2010-12-07 21:12:23 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2010-12-07 21:12:23 +0000 |
commit | 0c23b0b3a400457754b2429e56c3e9a9dbaad1a4 (patch) | |
tree | ef78e52d9f35b1769722fccb591fd21b564dbc2e | |
parent | 49162ab39b7c2bb473fccaa7b693b226033fd584 (diff) | |
download | openttd-0c23b0b3a400457754b2429e56c3e9a9dbaad1a4.tar.xz |
(svn r21429) -Fix [FS#3771]: the server didn't check for the paused state when allowing to execute commands
-rw-r--r-- | src/network/core/tcp_game.h | 4 | ||||
-rw-r--r-- | src/network/network_command.cpp | 24 |
2 files changed, 21 insertions, 7 deletions
diff --git a/src/network/core/tcp_game.h b/src/network/core/tcp_game.h index 40ffdb1d4..fc15e7ba8 100644 --- a/src/network/core/tcp_game.h +++ b/src/network/core/tcp_game.h @@ -141,8 +141,8 @@ public: /** Clear the command queue. */ ~CommandQueue() { this->Free(); } void Append(CommandPacket *p); - CommandPacket *Pop(); - CommandPacket *Peek(); + CommandPacket *Pop(bool ignore_paused = false); + CommandPacket *Peek(bool ignore_paused = false); void Free(); /** Get the number of items in the queue. */ uint Count() const { return this->count; } 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); } |