Removed the check that prevented Warp Portal from opening after you picked the destination, if there was someone blocking the cell.

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@11406 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
ultramage 2007-10-11 09:07:44 +00:00
parent 87aed8c07f
commit 87c447e2e9
5 changed files with 53 additions and 44 deletions

View File

@ -12,6 +12,8 @@ IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
appearance change instead of deleting one and creating the other appearance change instead of deleting one and creating the other
- due to the above, an opening warp is now properly accompanied by - due to the above, an opening warp is now properly accompanied by
the log-in like sound effect the log-in like sound effect
- Removed the check that prevented Warp Portal from opening after you
picked the destination, if there was someone blocking the cell
* Re-enabled packet 0x1ac to be sent when something gets ankle-snared * Re-enabled packet 0x1ac to be sent when something gets ankle-snared
* Partially removed the usage of 'flags' to direct the execution path * Partially removed the usage of 'flags' to direct the execution path
in skill unit code (some people seem to really like flags >_>) in skill unit code (some people seem to really like flags >_>)

View File

@ -117,21 +117,25 @@ static int pc_invincible_timer(int tid,unsigned int tick,int id,int data)
return 0; return 0;
} }
int pc_setinvincibletimer(struct map_session_data *sd,int val) void pc_setinvincibletimer(struct map_session_data* sd, int val)
{ {
nullpo_retr(0, sd); nullpo_retv(sd);
if(sd->invincible_timer != INVALID_TIMER) if( sd->invincible_timer != INVALID_TIMER )
delete_timer(sd->invincible_timer,pc_invincible_timer); delete_timer(sd->invincible_timer,pc_invincible_timer);
sd->invincible_timer = add_timer(gettick()+val,pc_invincible_timer,sd->bl.id,0); sd->invincible_timer = add_timer(gettick()+val,pc_invincible_timer,sd->bl.id,0);
return 0;
} }
void pc_delinvincibletimer_sub(struct map_session_data *sd) void pc_delinvincibletimer(struct map_session_data* sd)
{ {
delete_timer(sd->invincible_timer,pc_invincible_timer); nullpo_retv(sd);
sd->invincible_timer = INVALID_TIMER;
skill_unit_move(&sd->bl,gettick(),1); if( sd->invincible_timer != INVALID_TIMER )
{
delete_timer(sd->invincible_timer,pc_invincible_timer);
sd->invincible_timer = INVALID_TIMER;
skill_unit_move(&sd->bl,gettick(),1);
}
} }
static int pc_spiritball_timer(int tid,unsigned int tick,int id,int data) static int pc_spiritball_timer(int tid,unsigned int tick,int id,int data)

View File

@ -289,9 +289,8 @@ struct skill_tree_entry {
extern struct skill_tree_entry skill_tree[MAX_PC_CLASS][MAX_SKILL_TREE]; extern struct skill_tree_entry skill_tree[MAX_PC_CLASS][MAX_SKILL_TREE];
int pc_read_gm_account(int fd); int pc_read_gm_account(int fd);
int pc_setinvincibletimer(struct map_session_data *sd,int); void pc_setinvincibletimer(struct map_session_data* sd, int val);
void pc_delinvincibletimer_sub(struct map_session_data *sd); void pc_delinvincibletimer(struct map_session_data* sd);
#define pc_delinvincibletimer(sd) if ((sd)->invincible_timer != INVALID_TIMER) pc_delinvincibletimer_sub(sd)
int pc_addspiritball(struct map_session_data *sd,int,int); int pc_addspiritball(struct map_session_data *sd,int,int);
int pc_delspiritball(struct map_session_data *sd,int,int); int pc_delspiritball(struct map_session_data *sd,int,int);

View File

@ -6489,8 +6489,6 @@ int skill_castend_pos2(struct block_list* src, int x, int y, int skillid, int sk
*------------------------------------------*/ *------------------------------------------*/
int skill_castend_map (struct map_session_data *sd, int skill_num, const char *map) int skill_castend_map (struct map_session_data *sd, int skill_num, const char *map)
{ {
int x=0,y=0;
nullpo_retr(0, sd); nullpo_retr(0, sd);
//Simplify skill_failed code. //Simplify skill_failed code.
@ -6531,7 +6529,8 @@ int skill_castend_map (struct map_session_data *sd, int skill_num, const char *m
return 0; return 0;
} }
switch(skill_num){ switch(skill_num)
{
case AL_TELEPORT: case AL_TELEPORT:
if(strcmp(map,"Random")==0) if(strcmp(map,"Random")==0)
pc_randomwarp(sd,3); pc_randomwarp(sd,3);
@ -6545,7 +6544,9 @@ int skill_castend_map (struct map_session_data *sd, int skill_num, const char *m
struct skill_unit_group *group; struct skill_unit_group *group;
int i, lv, wx, wy; int i, lv, wx, wy;
int maxcount=0; int maxcount=0;
int x,y;
unsigned short mapindex; unsigned short mapindex;
mapindex = mapindex_name2id((char*)map); mapindex = mapindex_name2id((char*)map);
if(!mapindex) { //Given map not found? if(!mapindex) { //Given map not found?
clif_skill_fail(sd,skill_num,0,0); clif_skill_fail(sd,skill_num,0,0);
@ -6574,15 +6575,15 @@ int skill_castend_map (struct map_session_data *sd, int skill_num, const char *m
wx = sd->menuskill_val>>16; wx = sd->menuskill_val>>16;
wy = sd->menuskill_val&0xffff; wy = sd->menuskill_val&0xffff;
if(lv <= 0) return 0; if( lv <= 0 ) return 0;
for(i=0;i<lv;i++){ if( lv > 4 ) lv = 4; // crash prevention
if(mapindex == p[i]->map){
x=p[i]->x; // check if the chosen map exists in the memo list
y=p[i]->y; ARR_FIND( 0, lv, i, mapindex == p[i]->map );
break; if( i < lv ) {
} x=p[i]->x;
} y=p[i]->y;
if(x==0 || y==0) { } else {
skill_failed(sd); skill_failed(sd);
return 0; return 0;
} }
@ -6593,16 +6594,19 @@ int skill_castend_map (struct map_session_data *sd, int skill_num, const char *m
return 0; return 0;
} }
if(skill_check_unit_range2(&sd->bl,wx,wy,skill_num,lv) > 0) { // This makes Warp Portal fail if the cell is not empty
clif_skill_fail(sd,0,0,0); //if(skill_check_unit_range2(&sd->bl,wx,wy,skill_num,lv) > 0) {
skill_failed(sd); // clif_skill_fail(sd,0,0,0);
return 0; // skill_failed(sd);
} // return 0;
//}
if((group=skill_unitsetting(&sd->bl,skill_num,lv,wx,wy,0))==NULL) { if((group=skill_unitsetting(&sd->bl,skill_num,lv,wx,wy,0))==NULL) {
skill_failed(sd); skill_failed(sd);
return 0; return 0;
} }
//Now that there's a mapindex, use that in val3 rather than a string. [Skotlex]
// record the destination coordinates
group->val2 = (x<<16)|y; group->val2 = (x<<16)|y;
group->val3 = mapindex; group->val3 = mapindex;
} }
@ -6722,7 +6726,7 @@ struct skill_unit_group *skill_unitsetting (struct block_list *src, int skillid,
int active_flag=1; int active_flag=1;
int subunt=0; int subunt=0;
nullpo_retr(0, src); nullpo_retr(NULL, src);
limit = skill_get_time(skillid,skilllv); limit = skill_get_time(skillid,skilllv);
range = skill_get_unit_range(skillid,skilllv); range = skill_get_unit_range(skillid,skilllv);
@ -6731,22 +6735,12 @@ struct skill_unit_group *skill_unitsetting (struct block_list *src, int skillid,
unit_flag = skill_get_unit_flag(skillid); unit_flag = skill_get_unit_flag(skillid);
layout = skill_get_unit_layout(skillid,skilllv,src,x,y); layout = skill_get_unit_layout(skillid,skilllv,src,x,y);
if (skillid == AL_WARP && flag && src->type == BL_SKILL)
{ //Warp Portal morphing to active mode, extract relevant data from src. [Skotlex]
group= ((TBL_SKILL*)src)->group;
src = map_id2bl(group->src_id);
if (!src) return NULL;
val2=group->val2; //Copy the (x,y) position you warp to
val3=group->val3; //as well as the mapindex to warp to.
}
BL_CAST(BL_PC, src, sd); BL_CAST(BL_PC, src, sd);
status = status_get_status_data(src); status = status_get_status_data(src);
sc= status_get_sc(src); // for traps, firewall and fogwall - celest sc = status_get_sc(src); // for traps, firewall and fogwall - celest
if (sc && !sc->count)
sc = NULL;
switch(skillid){ switch(skillid)
{
case MG_SAFETYWALL: case MG_SAFETYWALL:
val2=skilllv+1; val2=skilllv+1;
@ -6761,6 +6755,15 @@ struct skill_unit_group *skill_unitsetting (struct block_list *src, int skillid,
val1=skilllv+6; val1=skilllv+6;
if(!(flag&1)) if(!(flag&1))
limit=2000; limit=2000;
else // previous implementation (not used anymore)
{ //Warp Portal morphing to active mode, extract relevant data from src. [Skotlex]
if( src->type != BL_SKILL ) return NULL;
group = ((TBL_SKILL*)src)->group;
src = map_id2bl(group->src_id);
if( !src ) return NULL;
val2 = group->val2; //Copy the (x,y) position you warp to
val3 = group->val3; //as well as the mapindex to warp to.
}
break; break;
case PR_SANCTUARY: case PR_SANCTUARY:
@ -10262,7 +10265,7 @@ int skill_unit_timer_sub (struct block_list* bl, va_list ap)
case UNT_WARP_ACTIVE: case UNT_WARP_ACTIVE:
// warp portal opens (morph to a UNT_WARP_WAITING cell) // warp portal opens (morph to a UNT_WARP_WAITING cell)
group->unit_id = UNT_WARP_WAITING; group->unit_id = skill_get_unit_id(group->skill_id, 1); // UNT_WARP_WAITING
clif_changelook(&unit->bl, LOOK_BASE, group->unit_id); clif_changelook(&unit->bl, LOOK_BASE, group->unit_id);
// restart timers // restart timers
group->limit = skill_get_time(group->skill_id,group->skill_lv); group->limit = skill_get_time(group->skill_id,group->skill_lv);

View File

@ -6847,6 +6847,7 @@ int status_change_timer(int tid, unsigned int tick, int id, int data)
break; break;
case SC_SPLASHER: case SC_SPLASHER:
// custom Venom Splasher countdown timer
//if (sc->data[type].val4 % 1000 == 0) { //if (sc->data[type].val4 % 1000 == 0) {
// char timer[10]; // char timer[10];
// snprintf (timer, 10, "%d", sc->data[type].val4/1000); // snprintf (timer, 10, "%d", sc->data[type].val4/1000);