summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/script_commands.txt13
-rw-r--r--src/map/script.c69
2 files changed, 66 insertions, 16 deletions
diff --git a/doc/script_commands.txt b/doc/script_commands.txt
index fb4c2530d..4909699c3 100644
--- a/doc/script_commands.txt
+++ b/doc/script_commands.txt
@@ -3226,15 +3226,22 @@ let you enter.
---------------------------------------
-*getareausers("<map name>",<x1>,<y1>,<x2>,<y2>)
+*getareausers({"<map name>",}{<x1>,<y1>,<x2>,<y2>})
+*getareausers({"<map name>",}{<radius>})
This function will return the count of connected characters which are
-located within the specified area - an x1/y1-x2/y2 square - on the
-specified map.
+located within the specified area. Area can be x1/y1-x2/y2 square,
+or radius from npc position. If map name missing, used attached player map.
This is useful for maps that are split into many buildings, such as all
the "*_in" maps, due to all the shops and houses.
+Examples:
+ // return players in area npc area on current map.
+ .@num = getareausers();
+ // return players in square (1, 1) - (10, 10)
+ .@num = "players: " + getareausers(1, 1, 10, 10);
+
---------------------------------------
*getusersname;
diff --git a/src/map/script.c b/src/map/script.c
index e59159586..fbfb88de2 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -10093,21 +10093,64 @@ int buildin_getareausers_sub(struct block_list *bl,va_list ap)
}
BUILDIN(getareausers)
{
- const char *str;
- int16 m,x0,y0,x1,y1;
+ int16 m = -1, x0, y0, x1, y1;
int users = 0;
- str=script_getstr(st,2);
- x0=script_getnum(st,3);
- y0=script_getnum(st,4);
- x1=script_getnum(st,5);
- y1=script_getnum(st,6);
- if( (m=map->mapname2mapid(str))< 0) {
- script_pushint(st,-1);
- return true;
+ int idx = 2;
+ struct npc_data *nd = NULL;
+ if (script_hasdata(st, 2) && script_isstringtype(st, 2)) {
+ const char *str = script_getstr(st, 2);
+ if ((m = map->mapname2mapid(str)) < 0) {
+ script_pushint(st, -1);
+ return true;
+ }
+ idx = 3;
+ }
+ if (m == -1)
+ {
+ TBL_PC *sd = NULL;
+ sd = script->rid2sd(st);
+ if (!sd)
+ {
+ script_pushint(st, -1);
+ return false;
+ }
+ m = sd->bl.m;
+ }
+ if (st->oid)
+ nd = map->id2nd(st->oid);
+ if (script_hasdata(st, idx + 3)) {
+ x0 = script_getnum(st, idx + 0);
+ y0 = script_getnum(st, idx + 1);
+ x1 = script_getnum(st, idx + 2);
+ y1 = script_getnum(st, idx + 3);
+ } else if (script_hasdata(st, idx)) {
+ if (!nd)
+ {
+ script_pushint(st, -1);
+ return true;
+ }
+ int sz = script_getnum(st, idx);
+ x0 = nd->bl.x - sz;
+ y0 = nd->bl.y - sz;
+ x1 = nd->bl.x + sz;
+ y1 = nd->bl.y + sz;
+ } else if (st->oid) {
+ if (!nd || nd->u.scr.xs == -1 || nd->u.scr.ys == -1)
+ {
+ script_pushint(st, -1);
+ return true;
+ }
+ x0 = nd->bl.x - nd->u.scr.xs;
+ y0 = nd->bl.y - nd->u.scr.ys;
+ x1 = nd->bl.x + nd->u.scr.xs;
+ y1 = nd->bl.y + nd->u.scr.ys;
+ } else {
+ script_pushint(st, -1);
+ return false;
}
map->foreachinarea(script->buildin_getareausers_sub,
- m,x0,y0,x1,y1,BL_PC,&users);
- script_pushint(st,users);
+ m, x0, y0, x1, y1, BL_PC, &users);
+ script_pushint(st, users);
return true;
}
@@ -19382,7 +19425,7 @@ void script_parse_builtin(void) {
BUILDIN_DEF(getusers,"i"),
BUILDIN_DEF(getmapguildusers,"si"),
BUILDIN_DEF(getmapusers,"s"),
- BUILDIN_DEF(getareausers,"siiii"),
+ BUILDIN_DEF(getareausers,"*"),
BUILDIN_DEF(getareadropitem,"siiiiv"),
BUILDIN_DEF(enablenpc,"s"),
BUILDIN_DEF(disablenpc,"s"),