summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2010-12-07 21:12:23 +0000
committerrubidium <rubidium@openttd.org>2010-12-07 21:12:23 +0000
commit0c23b0b3a400457754b2429e56c3e9a9dbaad1a4 (patch)
treeef78e52d9f35b1769722fccb591fd21b564dbc2e
parent49162ab39b7c2bb473fccaa7b693b226033fd584 (diff)
downloadopenttd-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.h4
-rw-r--r--src/network/network_command.cpp24
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);
}