diff options
author | Haru <haru@dotalux.com> | 2018-11-13 15:05:05 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-13 15:05:05 +0100 |
commit | bb2858fda55ca4ca3144232da9b837d9551aafc0 (patch) | |
tree | 05f4f3908f6246b902e6d4a13894f20ac2990cf8 /src | |
parent | 26efcebad2f3d316013cc1458925cd0ca70cb347 (diff) | |
parent | f3af2d37a90a83bbec25c15e59c29e0f9802daca (diff) | |
download | hercules-bb2858fda55ca4ca3144232da9b837d9551aafc0.tar.gz hercules-bb2858fda55ca4ca3144232da9b837d9551aafc0.tar.bz2 hercules-bb2858fda55ca4ca3144232da9b837d9551aafc0.tar.xz hercules-bb2858fda55ca4ca3144232da9b837d9551aafc0.zip |
Merge pull request #2105 from Helianthella/getunits3
break the loop in buildin_getunits when the max is reached
Diffstat (limited to 'src')
-rw-r--r-- | src/map/map.c | 13 | ||||
-rw-r--r-- | src/map/map.h | 1 | ||||
-rw-r--r-- | src/map/script.c | 14 |
3 files changed, 17 insertions, 11 deletions
diff --git a/src/map/map.c b/src/map/map.c index 343f219b8..a352d34b0 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -635,6 +635,18 @@ static int map_foreachinmap(int (*func)(struct block_list*, va_list), int16 m, i return returnCount; } +static int map_forcountinmap(int (*func)(struct block_list*, va_list), int16 m, int count, int type, ...) +{ + int returnCount; + va_list ap; + + va_start(ap, type); + returnCount = map->vforcountinarea(func, m, 0, 0, map->list[m].bxs, map->list[m].bys, count, type, ap); + va_end(ap); + + return returnCount; +} + /** * Applies func to every block_list object of bl_type type on all maps * of instance instance_id. @@ -6901,6 +6913,7 @@ void map_defaults(void) map->foreachinpath = map_foreachinpath; map->vforeachinmap = map_vforeachinmap; map->foreachinmap = map_foreachinmap; + map->forcountinmap = map_forcountinmap; map->vforeachininstance = map_vforeachininstance; map->foreachininstance = map_foreachininstance; diff --git a/src/map/map.h b/src/map/map.h index cb025e9c1..0e38bdb13 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -1293,6 +1293,7 @@ END_ZEROED_BLOCK; int (*foreachinpath) (int (*func)(struct block_list*,va_list), int16 m, int16 x0, int16 y0, int16 x1, int16 y1, int16 range, int length, int type, ...); int (*vforeachinmap) (int (*func)(struct block_list*,va_list), int16 m, int type, va_list args); int (*foreachinmap) (int (*func)(struct block_list*,va_list), int16 m, int type, ...); + int (*forcountinmap) (int (*func)(struct block_list*,va_list), int16 m, int count, int type, ...); int (*vforeachininstance)(int (*func)(struct block_list*,va_list), int16 instance_id, int type, va_list ap); int (*foreachininstance)(int (*func)(struct block_list*,va_list), int16 instance_id, int type,...); diff --git a/src/map/script.c b/src/map/script.c index d1839676f..8aceb0532 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -11300,7 +11300,7 @@ static int buildin_getunits_sub(struct block_list *bl, va_list ap) (const void *)h64BPTRSIZE(bl->id), ref); (*count)++; - return 0; + return 1; } static int buildin_getunits_sub_pc(struct map_session_data *sd, va_list ap) @@ -11372,18 +11372,10 @@ static BUILDIN(getunits) int16 x2 = script_getnum(st, 8); int16 y2 = script_getnum(st, 9); - // FIXME: map_foreachinarea does NOT stop iterating when the callback - // function returns -1. we still limit the array size, but - // this doesn't break the loop. We need a foreach function - // that behaves like map_foreachiddb, but for areas - map->foreachinarea(buildin_getunits_sub, m, x1, y1, x2, y2, type, + map->forcountinarea(buildin_getunits_sub, m, x1, y1, x2, y2, limit, type, st, sd, id, start, &count, limit, name, ref, type); } else { - // FIXME: map_foreachinmap does NOT stop iterating when the callback - // function returns -1. we still limit the array size, but - // this doesn't break the loop. We need a foreach function - // that behaves like map_foreachiddb, but for maps - map->foreachinmap(buildin_getunits_sub, m, type, + map->forcountinmap(buildin_getunits_sub, m, limit, type, st, sd, id, start, &count, limit, name, ref, type); } } else { |