From 5d51ba8e8b84af11603b0c9c87b6203618604df0 Mon Sep 17 00:00:00 2001 From: skotlex Date: Mon, 1 May 2006 21:53:17 +0000 Subject: - Added function map_foreachinshootrange, behaves the same way as map_foreachinrange, but it also performs a "shoot-path" check before invoking the function. Used in the skill subtimer function if skill_wall_check is defined. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@6436 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/map/map.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) (limited to 'src/map/map.c') diff --git a/src/map/map.c b/src/map/map.c index 950eb6e03..87fd292ba 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -673,7 +673,79 @@ int map_foreachinrange(int (*func)(struct block_list*,va_list),struct block_list for(i=0;inext){ if(bl && bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1 - && check_distance_bl(center, bl, range) +// && check_distance_bl(center, bl, range) + && bl_list_count=BL_LIST_MAX) { + if(battle_config.error_log) + ShowWarning("map_foreachinrange: block count too many!\n"); + } + + map_freeblock_lock(); // メモリからの解放を禁止する + + for(i=blockcount;iprev) // 有?かどうかチェック + returnCount += func(bl_list[i],ap); + + map_freeblock_unlock(); // 解放を許可する + + va_end(ap); + bl_list_count = blockcount; + return returnCount; //[Skotlex] +} + +/*========================================== + * Same as foreachinrange, but there must be a shoot-able range between center and target to be counted in. [Skotlex] + *------------------------------------------ + */ +int map_foreachinshootrange(int (*func)(struct block_list*,va_list),struct block_list *center, int range,int type,...) { + va_list ap; + int bx,by,m; + int returnCount =0; //total sum of returned values of func() [Skotlex] + struct block_list *bl=NULL; + int blockcount=bl_list_count,i,c; + int x0,x1,y0,y1; + m = center->m; + if (m < 0) + return 0; + va_start(ap,type); + x0 = center->x-range; + x1 = center->x+range; + y0 = center->y-range; + y1 = center->y+range; + + if (x0 < 0) x0 = 0; + if (y0 < 0) y0 = 0; + if (x1 >= map[m].xs) x1 = map[m].xs-1; + if (y1 >= map[m].ys) y1 = map[m].ys-1; + + if (type&~BL_MOB) + for (by = y0 / BLOCK_SIZE; by <= y1 / BLOCK_SIZE; by++) { + for(bx=x0/BLOCK_SIZE;bx<=x1/BLOCK_SIZE;bx++){ + bl = map[m].block[bx+by*map[m].bxs]; + c = map[m].block_count[bx+by*map[m].bxs]; + for(i=0;inext){ + if(bl && bl->type&type + && bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1 + && path_search_long(NULL,center->m,center->x,center->y,bl->x,bl->y) + && bl_list_countnext){ + if(bl + && bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1 + && path_search_long(NULL,center->m,center->x,center->y,bl->x,bl->y) && bl_list_count