diff options
author | Haru <haru@dotalux.com> | 2015-09-11 17:29:07 +0200 |
---|---|---|
committer | Haru <haru@dotalux.com> | 2015-11-14 17:55:16 +0100 |
commit | 7c787e8adde6a56bc32ab65e5d2cd5eb1e3deeaf (patch) | |
tree | a8dac718789612b6adc4e9a6c5ac5b3ab23f7614 /src | |
parent | 650727ddf52650283652a021539cef5e0d0df05b (diff) | |
download | hercules-7c787e8adde6a56bc32ab65e5d2cd5eb1e3deeaf.tar.gz hercules-7c787e8adde6a56bc32ab65e5d2cd5eb1e3deeaf.tar.bz2 hercules-7c787e8adde6a56bc32ab65e5d2cd5eb1e3deeaf.tar.xz hercules-7c787e8adde6a56bc32ab65e5d2cd5eb1e3deeaf.zip |
Corrected an issue causing queue iterators not to return their last value
- Follow-up to 918b1123963ac2f91a4d074b092ceef1db71b4e8, a9042bf0bee2d2453058b22973bea8f335c5a201
- Thanks to Dastgir
Signed-off-by: Haru <haru@dotalux.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/map/script.c | 30 |
1 files changed, 21 insertions, 9 deletions
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); |