summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/script_commands.txt6
-rw-r--r--src/map/script.c30
2 files changed, 25 insertions, 11 deletions
diff --git a/doc/script_commands.txt b/doc/script_commands.txt
index 218bb4803..28c218eba 100644
--- a/doc/script_commands.txt
+++ b/doc/script_commands.txt
@@ -9011,8 +9011,10 @@ even if you remove them from the queue.
---------------------------------------
*qicheck(<queue_iterator_id>);
-checks whether there is a next member in the iterator's queue, 1 when
-it does, 0 otherwise.
+
+Checks whether the current member in the iterator's queue exists.
+
+Returns 1 when it does, 0 otherwise.
---------------------------------------
diff --git a/src/map/script.c b/src/map/script.c
index 54d8d338d..61ee7e49f 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -19090,28 +19090,40 @@ BUILDIN(queueiterator) {
/* returns next/first member in the iterator, 0 if none */
BUILDIN(qiget) {
int idx = script_getnum(st, 2);
+ struct hQueueIterator *it = NULL;
- if( idx < 0 || idx >= script->hqis ) {
+ if (idx < 0 || idx >= script->hqis) {
ShowWarning("buildin_qiget: unknown queue iterator id %d\n",idx);
script_pushint(st, 0);
- } else if (script->hqi[idx].pos >= script->hqi[idx].items) {
- script_pushint(st, 0);
- } else {
- struct hQueueIterator *it = &script->hqi[idx];
- script_pushint(st, it->item[it->pos++]);
+ return true;
}
+ it = &script->hqi[idx];
+
+ if (it->pos >= it->items) {
+ if (it->pos == it->items)
+ ++it->pos; // Move beyond the last position to invalidate qicheck
+ script_pushint(st, 0);
+ return true;
+ }
+ script_pushint(st, it->item[it->pos++]);
return true;
}
/* Queue Iterator Check */
-/* returns 1:0 if there is a next member in the iterator */
+/* returns 1:0 if there is the current member in the iterator exists */
BUILDIN(qicheck) {
int idx = script_getnum(st, 2);
+ struct hQueueIterator *it = NULL;
- if( idx < 0 || idx >= script->hqis ) {
+ if (idx < 0 || idx >= script->hqis) {
ShowWarning("buildin_qicheck: unknown queue iterator id %d\n",idx);
script_pushint(st, 0);
- } else if (script->hqi[idx].pos >= script->hqi[idx].items) {
+ return true;
+ }
+
+ it = &script->hqi[idx];
+
+ if (it->pos <= 0 || it->pos > it->items) {
script_pushint(st, 0);
} else {
script_pushint(st, 1);