diff options
author | Haru <haru@dotalux.com> | 2017-03-12 02:33:21 +0100 |
---|---|---|
committer | Haru <haru@dotalux.com> | 2017-03-12 02:33:21 +0100 |
commit | 386a671bf48dd4e867b0c89df0fe42beb2fe39d7 (patch) | |
tree | 9e8de976be3611ea461555f29d2cad1950dc7424 | |
parent | 1470ca226c51b3269c30c0b80774240092849239 (diff) | |
parent | ebb77e29f343531b508f8c37b32826afbb5f240d (diff) | |
download | hercules-386a671bf48dd4e867b0c89df0fe42beb2fe39d7.tar.gz hercules-386a671bf48dd4e867b0c89df0fe42beb2fe39d7.tar.bz2 hercules-386a671bf48dd4e867b0c89df0fe42beb2fe39d7.tar.xz hercules-386a671bf48dd4e867b0c89df0fe42beb2fe39d7.zip |
Merge pull request #1496 from Emistry/scriptcommand_warpguild
Updated *warpguild() script command.
-rw-r--r-- | doc/script_commands.txt | 5 | ||||
-rw-r--r-- | src/map/script.c | 61 |
2 files changed, 37 insertions, 29 deletions
diff --git a/doc/script_commands.txt b/doc/script_commands.txt index 6df1f6e87..b4c033a93 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -4321,7 +4321,7 @@ Example: --------------------------------------- -*warpguild("<mapname>", <x>, <y>, <guild_id>) +*warpguild("<mapname>", <x>, <y>, <guild_id>, {"<from_mapname>"}) Warps a guild to specified map and coordinate given the guild id, which you can get with getcharid(CHAR_ID_GUILD). You can also request another guild id given @@ -4334,10 +4334,13 @@ SavePointAll: All guild members are warped to their respective save point. SavePoint: All guild members are warped to the save point of the currently attached player (will fail if there's no player attached). + +If you specify a from_mapname, warpguild() will only affect those on that map. Example: warpguild("prontera", x, y, Guild_ID); + warpguild("prontera", x, y, Guild_ID, "payon"); // warp member from Payon map only. --------------------------------------- diff --git a/src/map/script.c b/src/map/script.c index a7e27fc1b..913208fff 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -6672,61 +6672,66 @@ BUILDIN(warpparty) } /*========================================== * Warpguild - [Fredzilla] - * Syntax: warpguild "mapname",x,y,Guild_ID; + * Syntax: warpguild "mapname",x,y,Guild_ID,{"from_mapname"}; *------------------------------------------*/ BUILDIN(warpguild) { struct map_session_data *sd = NULL; - struct map_session_data *pl_sd; struct guild* g; - struct s_mapiterator* iter; int type; + int i; + int16 map_index = -1; - const char* str = script_getstr(st,2); - int x = script_getnum(st,3); - int y = script_getnum(st,4); - int gid = script_getnum(st,5); + const char *str = script_getstr(st, 2); + int x = script_getnum(st, 3); + int y = script_getnum(st, 4); + int gid = script_getnum(st, 5); + + if (script_hasdata(st, 6)) { + map_index = map->mapname2mapid(script_getstr(st, 6)); + } g = guild->search(gid); - if( g == NULL ) + if(g == NULL) return true; - type = ( strcmp(str,"Random")==0 ) ? 0 - : ( strcmp(str,"SavePointAll")==0 ) ? 1 - : ( strcmp(str,"SavePoint")==0 ) ? 2 + type = (strcmp(str, "Random") == 0) ? 0 + : (strcmp(str, "SavePointAll") == 0) ? 1 + : (strcmp(str, "SavePoint") == 0) ? 2 : 3; - if( type == 2 && ( sd = script->rid2sd(st) ) == NULL ) + if (type == 2 && (sd = script->rid2sd(st)) == NULL) {// "SavePoint" uses save point of the currently attached player return true; } - iter = mapit_getallusers(); - for (pl_sd = BL_UCAST(BL_PC, mapit->first(iter)); mapit->exists(iter); pl_sd = BL_UCAST(BL_PC, mapit->next(iter))) { - if( pl_sd->status.guild_id != gid ) - continue; + for (i = 0; i < MAX_GUILD; i++) { + if (g->member[i].online && g->member[i].sd != NULL) { - switch( type ) - { + if (map_index >= 0 && map_index != g->member[i].sd->bl.m) + continue; + + switch (type) + { case 0: // Random - if(!map->list[pl_sd->bl.m].flag.nowarp) - pc->randomwarp(pl_sd,CLR_TELEPORT); + if (!map->list[g->member[i].sd->bl.m].flag.nowarp) + pc->randomwarp(g->member[i].sd, CLR_TELEPORT); break; case 1: // SavePointAll - if(!map->list[pl_sd->bl.m].flag.noreturn) - pc->setpos(pl_sd,pl_sd->status.save_point.map,pl_sd->status.save_point.x,pl_sd->status.save_point.y,CLR_TELEPORT); + if (!map->list[g->member[i].sd->bl.m].flag.noreturn) + pc->setpos(g->member[i].sd, g->member[i].sd->status.save_point.map, g->member[i].sd->status.save_point.x, g->member[i].sd->status.save_point.y, CLR_TELEPORT); break; case 2: // SavePoint - if(!map->list[pl_sd->bl.m].flag.noreturn) - pc->setpos(pl_sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,CLR_TELEPORT); + if (!map->list[g->member[i].sd->bl.m].flag.noreturn) + pc->setpos(g->member[i].sd, sd->status.save_point.map, sd->status.save_point.x, sd->status.save_point.y, CLR_TELEPORT); break; case 3: // m,x,y - if(!map->list[pl_sd->bl.m].flag.noreturn && !map->list[pl_sd->bl.m].flag.nowarp) - pc->setpos(pl_sd,script->mapindexname2id(st,str),x,y,CLR_TELEPORT); + if (!map->list[g->member[i].sd->bl.m].flag.noreturn && !map->list[g->member[i].sd->bl.m].flag.nowarp) + pc->setpos(g->member[i].sd, script->mapindexname2id(st, str), x, y, CLR_TELEPORT); break; + } } } - mapit->free(iter); return true; } @@ -20981,7 +20986,7 @@ void script_parse_builtin(void) { BUILDIN_DEF(areawarp,"siiiisii??"), BUILDIN_DEF(warpchar,"siii"), // [LuzZza] BUILDIN_DEF(warpparty,"siii?"), // [Fredzilla] [Paradox924X] - BUILDIN_DEF(warpguild,"siii"), // [Fredzilla] + BUILDIN_DEF(warpguild,"siii?"), // [Fredzilla] BUILDIN_DEF(setlook,"ii"), BUILDIN_DEF(changelook,"ii"), // Simulates but don't Store it BUILDIN_DEF2(__setr,"set","rv"), |