From f50ce9e6be15ed32eee03ea919641ca2692c52ec Mon Sep 17 00:00:00 2001 From: xantara Date: Wed, 15 Aug 2012 01:12:36 +0000 Subject: ` Changed areawarp script command to accept two additional, yet optional, parameters to allow an area warp to an area (instead of just a specific coordinates). See documentation. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@16636 54d463be-8e91-2dee-dedb-b68131a5f0ec --- doc/script_commands.txt | 7 ++++- src/map/script.c | 74 ++++++++++++++++++++++++++++++++++--------------- 2 files changed, 58 insertions(+), 23 deletions(-) diff --git a/doc/script_commands.txt b/doc/script_commands.txt index e3949afde..f63288da1 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -3701,7 +3701,7 @@ There are also three special 'map names' you can use. --------------------------------------- -*areawarp "",,,,,"",,; +*areawarp "",,,,,"",,{,,}; This command is similar to 'warp', however, it will not refer to the invoking character, but instead, all characters within a specified area, defined by the @@ -3719,6 +3719,11 @@ Y 150 By using ,0,0; as the destination coordinates it will take all the characters in the affected area to a random set of co-ordinates on "place2". + areawarp "place",10,10,120,120,"place2",150,150,200,200; + +By using the optional x4 and y4 parameters, the destination coordinates will be a +random place within the defined x3/y3-x4/y4 square. + Like 'warp', areawarp will also explicitly warp characters randomly into the current map if you give the 'to map name' as "Random". diff --git a/src/map/script.c b/src/map/script.c index a6a8eaa17..50740cb9a 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -5008,43 +5008,73 @@ BUILDIN_FUNC(warp) *------------------------------------------*/ static int buildin_areawarp_sub(struct block_list *bl,va_list ap) { - int x,y; - unsigned int map; - map=va_arg(ap, unsigned int); - x=va_arg(ap,int); - y=va_arg(ap,int); - if(map == 0) + int x2,y2,x3,y3; + unsigned int index; + + index = va_arg(ap,unsigned int); + x2 = va_arg(ap,int); + y2 = va_arg(ap,int); + x3 = va_arg(ap,int); + y3 = va_arg(ap,int); + + if(index == 0) pc_randomwarp((TBL_PC *)bl,CLR_TELEPORT); + else if(x3 && y3) { + int max, tx, ty, j = 0; + + // choose a suitable max number of attempts + if( (max = (y3-y2+1)*(x3-x2+1)*3) > 1000 ) + max = 1000; + + // find a suitable map cell + do { + tx = rnd()%(x3-x2+1)+x2; + ty = rnd()%(y3-y2+1)+y2; + j++; + } while( map_getcell(index,tx,ty,CELL_CHKNOPASS) && j < max ); + + pc_setpos((TBL_PC *)bl,index,tx,ty,CLR_OUTSIGHT); + } else - pc_setpos((TBL_PC *)bl,map,x,y,CLR_OUTSIGHT); + pc_setpos((TBL_PC *)bl,index,x2,y2,CLR_OUTSIGHT); return 0; } BUILDIN_FUNC(areawarp) { - int x,y,m; + int m, x0,y0,x1,y1, x2,y2,x3=0,y3=0; unsigned int index; const char *str; const char *mapname; - int x0,y0,x1,y1; - mapname=script_getstr(st,2); - x0=script_getnum(st,3); - y0=script_getnum(st,4); - x1=script_getnum(st,5); - y1=script_getnum(st,6); - str=script_getstr(st,7); - x=script_getnum(st,8); - y=script_getnum(st,9); + mapname = script_getstr(st,2); + x0 = script_getnum(st,3); + y0 = script_getnum(st,4); + x1 = script_getnum(st,5); + y1 = script_getnum(st,6); + str = script_getstr(st,7); + x2 = script_getnum(st,8); + y2 = script_getnum(st,9); + + if( script_hasdata(st,10) && script_hasdata(st,11) ) { // Warp area to area + if( (x3 = script_getnum(st,10)) < 0 || (y3 = script_getnum(st,11)) < 0 ){ + x3 = 0; + y3 = 0; + } else if( x3 && y3 ) { + // normalize x3/y3 coordinates + if( x3 < x2 ) swap(x3,x2); + if( y3 < y2 ) swap(y3,y2); + } + } - if( (m=map_mapname2mapid(mapname))< 0) + if( (m = map_mapname2mapid(mapname)) < 0 ) return 0; - if(strcmp(str,"Random")==0) + if( strcmp(str,"Random") == 0 ) index = 0; - else if(!(index=mapindex_name2id(str))) + else if( !(index=mapindex_name2id(str)) ) return 0; - map_foreachinarea(buildin_areawarp_sub, m,x0,y0,x1,y1,BL_PC, index,x,y); + map_foreachinarea(buildin_areawarp_sub, m,x0,y0,x1,y1, BL_PC, index,x2,y2,x3,y3); return 0; } @@ -16914,7 +16944,7 @@ struct script_function buildin_func[] = { BUILDIN_DEF(jobname,"i"), BUILDIN_DEF(input,"r??"), BUILDIN_DEF(warp,"sii"), - BUILDIN_DEF(areawarp,"siiiisii"), + BUILDIN_DEF(areawarp,"siiiisii??"), BUILDIN_DEF(warpchar,"siii"), // [LuzZza] BUILDIN_DEF(warpparty,"siii?"), // [Fredzilla] [Paradox924X] BUILDIN_DEF(warpguild,"siii"), // [Fredzilla] -- cgit v1.2.3-70-g09d2