Fixed Giant Fly Wing behavior (#6204)

Adds new RandomAll warpparty mode and fixes Giant Fly Wing behavior

Fixes #6160

Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Co-authored-by: Aleos <aleos89@users.noreply.github.com>
This commit is contained in:
Daegaladh 2022-01-10 11:19:55 +01:00 committed by GitHub
parent c22ef3f547
commit f46dccff85
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 100 additions and 40 deletions

View File

@ -4248,6 +4248,7 @@ SavePoint: All party members are warped to the save point of the currently
attached player (will fail if there's no player attached). attached player (will fail if there's no player attached).
Leader: All party members are warped to the leader's position. The leader must Leader: All party members are warped to the leader's position. The leader must
be online and in the current map-server for this to work. be online and in the current map-server for this to work.
RandomAll: All party members are warped to the same random position in their current map
If you specify a from_mapname, 'warpparty' will only affect those on that map. If you specify a from_mapname, 'warpparty' will only affect those on that map.

View File

@ -51,10 +51,10 @@ function script F_CashStore {
// - Summon Party members on party leader map to a 3x3 location around the leader. // - Summon Party members on party leader map to a 3x3 location around the leader.
// - No arguments. // - No arguments.
function script F_CashPartyCall { function script F_CashPartyCall {
itemskill "AL_TELEPORT",1; if (is_party_leader())
sleep2 1; // a slight delay seems necessary after itemskill warpparty "RandomAll", 0, 0, getcharid(1), strcharinfo(3), 3, 3;
if (is_party_leader() == true) else
warpparty "Leader", 0, 0, getcharid(1), strcharinfo(3), 3, 3; itemskill "AL_TELEPORT",1;
return; return;
} }

View File

@ -5700,6 +5700,15 @@ BUILDIN_FUNC(areapercentheal)
return SCRIPT_CMD_SUCCESS; return SCRIPT_CMD_SUCCESS;
} }
enum e_warpparty_target{
WARPPARTY_RANDOM = 0,
WARPPARTY_SAVEPOINTALL,
WARPPARTY_SAVEPOINT,
WARPPARTY_LEADER,
WARPPARTY_RANDOMALL,
WARPPARTY_RANDOMALLAREA
};
/*========================================== /*==========================================
* Warpparty - [Fredzilla] [Paradox924X] * Warpparty - [Fredzilla] [Paradox924X]
* Syntax: warpparty "to_mapname",x,y,Party_ID,{<"from_mapname">,<range x>,<range y>}; * Syntax: warpparty "to_mapname",x,y,Party_ID,{<"from_mapname">,<range x>,<range y>};
@ -5710,7 +5719,7 @@ BUILDIN_FUNC(warpparty)
TBL_PC *sd = NULL; TBL_PC *sd = NULL;
TBL_PC *pl_sd; TBL_PC *pl_sd;
struct party_data* p; struct party_data* p;
int type, mapindex = 0, m = -1, i, rx = 0, ry = 0; int mapindex = 0, m = -1, i, rx = 0, ry = 0;
const char* str = script_getstr(st,2); const char* str = script_getstr(st,2);
int x = script_getnum(st,3); int x = script_getnum(st,3);
@ -5728,15 +5737,21 @@ BUILDIN_FUNC(warpparty)
if(!p) if(!p)
return SCRIPT_CMD_SUCCESS; return SCRIPT_CMD_SUCCESS;
type = ( strcmp(str,"Random")==0 ) ? 0 enum e_warpparty_target type = ( strcmp(str,"Random")==0 ) ? WARPPARTY_RANDOM
: ( strcmp(str,"SavePointAll")==0 ) ? 1 : ( strcmp(str,"SavePointAll")==0 ) ? WARPPARTY_SAVEPOINTALL
: ( strcmp(str,"SavePoint")==0 ) ? 2 : ( strcmp(str,"SavePoint")==0 ) ? WARPPARTY_SAVEPOINT
: ( strcmp(str,"Leader")==0 ) ? 3 : ( strcmp(str,"Leader")==0 ) ? WARPPARTY_LEADER
: 4; : ( strcmp(str,"RandomAll")==0 ) ? WARPPARTY_RANDOMALL
: WARPPARTY_RANDOMALLAREA;
switch (type) switch (type)
{ {
case 3: case WARPPARTY_SAVEPOINT:
//"SavePoint" uses save point of the currently attached player
if ( !script_rid2sd(sd) )
return SCRIPT_CMD_FAILURE;
break;
case WARPPARTY_LEADER:
for(i = 0; i < MAX_PARTY && !p->party.member[i].leader; i++); for(i = 0; i < MAX_PARTY && !p->party.member[i].leader; i++);
if (i == MAX_PARTY || !p->data[i].sd) //Leader not found / not online if (i == MAX_PARTY || !p->data[i].sd) //Leader not found / not online
return SCRIPT_CMD_FAILURE; return SCRIPT_CMD_FAILURE;
@ -5746,18 +5761,36 @@ BUILDIN_FUNC(warpparty)
x = pl_sd->bl.x; x = pl_sd->bl.x;
y = pl_sd->bl.y; y = pl_sd->bl.y;
break; break;
case 4: case WARPPARTY_RANDOMALL: {
if ( !script_rid2sd(sd) )
return SCRIPT_CMD_FAILURE;
mapindex = sd->mapindex;
m = map_mapindex2mapid(mapindex);
struct map_data *mapdata = map_getmapdata(m);
if ( mapdata == nullptr || mapdata->flag[MF_NOWARP] || mapdata->flag[MF_NOTELEPORT] )
return SCRIPT_CMD_FAILURE;
i = 0;
do {
x = rnd()%(mapdata->xs - 2) + 1;
y = rnd()%(mapdata->ys - 2) + 1;
} while ((map_getcell(m,x,y,CELL_CHKNOPASS) || (!battle_config.teleport_on_portal && npc_check_areanpc(1,m,x,y,1))) && (i++) < 1000);
if (i >= 1000) {
ShowError("buildin_warpparty: moving player '%s' to \"%s\",%d,%d failed.\n", sd->status.name, str, x, y);
return SCRIPT_CMD_FAILURE;
}
} break;
case WARPPARTY_RANDOMALLAREA:
mapindex = mapindex_name2id(str); mapindex = mapindex_name2id(str);
if (!mapindex) {// Invalid map if (!mapindex) {// Invalid map
return SCRIPT_CMD_FAILURE; return SCRIPT_CMD_FAILURE;
} }
m = map_mapindex2mapid(mapindex); m = map_mapindex2mapid(mapindex);
break; break;
case 2:
//"SavePoint" uses save point of the currently attached player
if ( !script_rid2sd(sd) )
return SCRIPT_CMD_SUCCESS;
break;
} }
for (i = 0; i < MAX_PARTY; i++) for (i = 0; i < MAX_PARTY; i++)
@ -5765,45 +5798,71 @@ BUILDIN_FUNC(warpparty)
if( !(pl_sd = p->data[i].sd) || pl_sd->status.party_id != p_id ) if( !(pl_sd = p->data[i].sd) || pl_sd->status.party_id != p_id )
continue; continue;
if( str2 && strcmp(str2, map_getmapdata(pl_sd->bl.m)->name) != 0 ) map_data* mapdata = map_getmapdata(pl_sd->bl.m);
if( str2 && strcmp(str2, mapdata->name) != 0 )
continue; continue;
if( pc_isdead(pl_sd) ) if( pc_isdead(pl_sd) )
continue; continue;
e_setpos ret = SETPOS_OK;
switch( type ) switch( type )
{ {
case 0: // Random case WARPPARTY_RANDOM:
if(!map_getmapflag(pl_sd->bl.m, MF_NOWARP)) if (!mapdata->flag[MF_NOWARP])
pc_randomwarp(pl_sd,CLR_TELEPORT); ret = (e_setpos)pc_randomwarp(pl_sd,CLR_TELEPORT);
break; break;
case 1: // SavePointAll case WARPPARTY_SAVEPOINTALL:
if(!map_getmapflag(pl_sd->bl.m, MF_NORETURN)) if (!mapdata->flag[MF_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); ret = pc_setpos(pl_sd,pl_sd->status.save_point.map,pl_sd->status.save_point.x,pl_sd->status.save_point.y,CLR_TELEPORT);
break; break;
case 2: // SavePoint case WARPPARTY_SAVEPOINT:
if(!map_getmapflag(pl_sd->bl.m, MF_NORETURN)) if (!mapdata->flag[MF_NORETURN])
pc_setpos(pl_sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,CLR_TELEPORT); ret = pc_setpos(pl_sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,CLR_TELEPORT);
break; break;
case 3: // Leader case WARPPARTY_LEADER:
if (p->party.member[i].leader) if (p->party.member[i].leader)
continue; continue;
case 4: // m,x,y // Fall through
if (rx || ry) { case WARPPARTY_RANDOMALL:
int x1 = x + rx, y1 = y + ry, if (pl_sd == sd) {
x0 = x - rx, y0 = y - ry; ret = pc_setpos(pl_sd, mapindex, x, y, CLR_TELEPORT);
uint8 attempts = 10; break;
do {
x = x0 + rnd()%(x1 - x0 + 1);
y = y0 + rnd()%(y1 - y0 + 1);
} while ((--attempts) > 0 && !map_getcell(m, x, y, CELL_CHKPASS));
} }
// Fall through
case WARPPARTY_RANDOMALLAREA:
if(!mapdata->flag[MF_NORETURN] && !mapdata->flag[MF_NOWARP] && pc_job_can_entermap((enum e_job)pl_sd->status.class_, m, pl_sd->group_level)){
if (rx || ry) {
int x1 = x + rx, y1 = y + ry,
x0 = x - rx, y0 = y - ry,
nx, ny;
uint8 attempts = 10;
if(!map_getmapflag(pl_sd->bl.m, MF_NORETURN) && !map_getmapflag(pl_sd->bl.m, MF_NOWARP) && pc_job_can_entermap((enum e_job)pl_sd->status.class_, m, pl_sd->group_level)) do {
pc_setpos(pl_sd,mapindex,x,y,CLR_TELEPORT); nx = x0 + rnd()%(x1 - x0 + 1);
ny = y0 + rnd()%(y1 - y0 + 1);
} while ((--attempts) > 0 && !map_getcell(m, nx, ny, CELL_CHKPASS));
if (attempts != 0) { //Keep the original coordinates if fails to find a valid cell within the range
x = nx;
y = ny;
}
}
ret = pc_setpos(pl_sd, mapindex, x, y, CLR_TELEPORT);
}
break; break;
} }
if( ret != SETPOS_OK ) {
ShowError("buildin_warpparty: moving player '%s' to \"%s\",%d,%d failed.\n", pl_sd->status.name, str, x, y);
if ( ( type == WARPPARTY_RANDOMALL || type == WARPPARTY_RANDOMALLAREA ) && (rx || ry) )
continue;
else
return SCRIPT_CMD_FAILURE;
}
} }
return SCRIPT_CMD_SUCCESS; return SCRIPT_CMD_SUCCESS;