summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgumi <git@gumi.ca>2018-11-07 16:14:36 -0500
committergumi <git@gumi.ca>2018-11-07 16:15:26 -0500
commitf3af2d37a90a83bbec25c15e59c29e0f9802daca (patch)
treead869c6a1ed701fe4e42961ec572cfd5b12e63a9
parentb30f62468a5e923bf5d9533adec064ada1716459 (diff)
downloadhercules-f3af2d37a90a83bbec25c15e59c29e0f9802daca.tar.gz
hercules-f3af2d37a90a83bbec25c15e59c29e0f9802daca.tar.bz2
hercules-f3af2d37a90a83bbec25c15e59c29e0f9802daca.tar.xz
hercules-f3af2d37a90a83bbec25c15e59c29e0f9802daca.zip
break the loop in buildin_getunits when the max is reached
-rw-r--r--src/map/map.c13
-rw-r--r--src/map/map.h1
-rw-r--r--src/map/script.c14
3 files changed, 17 insertions, 11 deletions
diff --git a/src/map/map.c b/src/map/map.c
index ce8f4cdf5..d59223477 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.
@@ -6873,6 +6885,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 207fef2ce..590cc5dea 100644
--- a/src/map/map.h
+++ b/src/map/map.h
@@ -1285,6 +1285,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 e38aae562..5e900167d 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -11382,7 +11382,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)
@@ -11454,18 +11454,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 {