Snap, Ganbantein, Gravitational Field, Flying Kick (fixes #1052)
* Snap now has a server-sided range of 14 * Snap, Ganbantein and Gravitational Field will no longer cause you to move if you target a cell out of range * Snap and Flying Kick will now check for obstacles on a linear path rather than on the normal walkpath * Range specified in skill_db is now equal to the client-sided range * Some range code cleanup
This commit is contained in:
parent
fbb8edba39
commit
b5de854b90
@ -638,7 +638,7 @@
|
||||
431,0,0,4,0,0x1,0,4,1,yes,0,0,0,magic,0,0x0, SG_SUN_COMFORT,Comfort of the Sun
|
||||
432,0,0,4,0,0x1,0,4,1,yes,0,0,0,magic,0,0x0, SG_MOON_COMFORT,Comfort of the Moon
|
||||
433,0,0,4,0,0x1,0,4,1,yes,0,0,0,magic,0,0x0, SG_STAR_COMFORT,Comfort of the Stars
|
||||
434,10,6,1,0,0x1,0,3,1,yes,0,0,0,magic,0,0x0, SG_HATE,Hatred of the Sun Moon and Stars
|
||||
434,9,6,1,0,0x1,0,3,1,yes,0,0,0,magic,0,0x0, SG_HATE,Hatred of the Sun Moon and Stars
|
||||
435,0,0,0,0,0,0,3,0,no,0,0,0,none,0,0x0, SG_SUN_ANGER,Anger of the Sun
|
||||
436,0,0,0,0,0,0,3,0,no,0,0,0,none,0,0x0, SG_MOON_ANGER,Anger of the Moon
|
||||
437,0,0,0,0,0,0,3,0,no,0,0,0,none,0,0x0, SG_STAR_ANGER,Anger of the Stars
|
||||
@ -702,8 +702,8 @@
|
||||
480,5,8,1,0,0,0,5,5,no,0,0,0,weapon,0,0x20000, PA_SHIELDCHAIN,Shield Chain
|
||||
481,0,0,0,0,0,0,5,0,no,0,0,0,none,0,0x0, HP_MANARECHARGE,Mana Recharge
|
||||
482,0,6,4,0,0x1,0,5,1,no,0,0,0,magic,0,0x0, PF_DOUBLECASTING,Double Casting
|
||||
483,14,6,2,0,0x1,1:2:3:4:5,1,1,no,0,0,0,none,0,0x0, HW_GANBANTEIN,Ganbantein
|
||||
484,14,6,2,2,0xD1,0,5,1,yes,0,0x18000,0,misc,0,0x11010, HW_GRAVITATION,Gravitation Field
|
||||
483,18,6,2,0,0x1,1:2:3:4:5,1,1,no,0,0,0,none,0,0x0, HW_GANBANTEIN,Ganbantein
|
||||
484,18,6,2,2,0xD1,0,5,1,yes,0,0x18000,0,misc,0,0x11010, HW_GRAVITATION,Gravitation Field
|
||||
485,-2,6,1,-1,0x8,0,10,1,no,0,0,0,weapon,0,0x4000, WS_CARTTERMINATION,Cart Termination
|
||||
486,0,6,4,0,0x1,0,5,1,no,0,0,0,weapon,0,0x4000, WS_OVERTHRUSTMAX,Maximum Power Thrust
|
||||
487,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x8, CG_LONGINGFREEDOM,Longing for Freedom
|
||||
|
@ -638,7 +638,7 @@
|
||||
431,0,0,4,0,0x1,0,4,1,yes,0,0,0,magic,0,0x0, SG_SUN_COMFORT,Comfort of the Sun
|
||||
432,0,0,4,0,0x1,0,4,1,yes,0,0,0,magic,0,0x0, SG_MOON_COMFORT,Comfort of the Moon
|
||||
433,0,0,4,0,0x1,0,4,1,yes,0,0,0,magic,0,0x0, SG_STAR_COMFORT,Comfort of the Stars
|
||||
434,10,6,1,0,0x1,0,3,1,yes,0,0,0,magic,0,0x0, SG_HATE,Hatred of the Sun Moon and Stars
|
||||
434,9,6,1,0,0x1,0,3,1,yes,0,0,0,magic,0,0x0, SG_HATE,Hatred of the Sun Moon and Stars
|
||||
435,0,0,0,0,0,0,3,0,no,0,0,0,none,0,0x0, SG_SUN_ANGER,Anger of the Sun
|
||||
436,0,0,0,0,0,0,3,0,no,0,0,0,none,0,0x0, SG_MOON_ANGER,Anger of the Moon
|
||||
437,0,0,0,0,0,0,3,0,no,0,0,0,none,0,0x0, SG_STAR_ANGER,Anger of the Stars
|
||||
@ -702,8 +702,8 @@
|
||||
480,5,8,1,-1,0,0,5,5,no,0,0,0,weapon,0,0x20000, PA_SHIELDCHAIN,Shield Chain
|
||||
481,0,0,0,0,0,0,5,0,no,0,0,0,none,0,0x0, HP_MANARECHARGE,Mana Recharge
|
||||
482,0,6,4,0,0x1,0,5,1,no,0,0,0,magic,0,0x0, PF_DOUBLECASTING,Double Casting
|
||||
483,14,6,2,0,0x1,1:2:3:4:5,1,1,no,0,0,0,none,0,0x0, HW_GANBANTEIN,Ganbantein
|
||||
484,14,6,2,2,0xD1,0,5,1,yes,0,0x18000,0,misc,0,0x11010, HW_GRAVITATION,Gravitation Field
|
||||
483,18,6,2,0,0x1,1:2:3:4:5,1,1,no,0,0,0,none,0,0x0, HW_GANBANTEIN,Ganbantein
|
||||
484,18,6,2,2,0xD1,0,5,1,yes,0,0x18000,0,misc,0,0x11010, HW_GRAVITATION,Gravitation Field
|
||||
485,-2,6,1,-1,0x8,0,10,1,no,0,0,0,weapon,0,0x4000, WS_CARTTERMINATION,Cart Termination
|
||||
486,0,6,4,0,0x1,0,5,1,no,0,0,0,weapon,0,0x4000, WS_OVERTHRUSTMAX,Maximum Power Thrust
|
||||
487,0,6,4,0,0x1,0,5,1,no,0,0,0,none,0,0x8, CG_LONGINGFREEDOM,Longing for Freedom
|
||||
|
@ -2001,7 +2001,7 @@ static int battle_range_type(struct block_list *src, struct block_list *target,
|
||||
}
|
||||
|
||||
//based on used skill's range
|
||||
if (skill_get_range2(src, skill_id, skill_lv) < 4)
|
||||
if (skill_get_range2(src, skill_id, skill_lv, true) < 4)
|
||||
return BF_SHORT;
|
||||
return BF_LONG;
|
||||
}
|
||||
|
@ -1620,7 +1620,7 @@ int clif_homskillinfoblock(struct map_session_data *sd)
|
||||
WFIFOW(fd,len+4) = 0;
|
||||
WFIFOW(fd,len+6) = hd->homunculus.hskill[idx].lv;
|
||||
WFIFOW(fd,len+8) = skill_get_sp(id,hd->homunculus.hskill[idx].lv);
|
||||
WFIFOW(fd,len+10)= skill_get_range2(&sd->hd->bl, id,hd->homunculus.hskill[idx].lv);
|
||||
WFIFOW(fd,len+10)= skill_get_range2(&sd->hd->bl,id,hd->homunculus.hskill[idx].lv,false);
|
||||
safestrncpy((char*)WFIFOP(fd,len+12), skill_get_name(id), NAME_LENGTH);
|
||||
WFIFOB(fd,len+36) = (hd->homunculus.level < hom_skill_get_min_level(hd->homunculus.class_, id) || hd->homunculus.hskill[idx].lv >= hom_skill_tree_get_max(id, hd->homunculus.class_)) ? 0 : 1;
|
||||
len+=37;
|
||||
@ -1650,7 +1650,7 @@ void clif_homskillup(struct map_session_data *sd, uint16 skill_id)
|
||||
WFIFOW(fd,2) = skill_id;
|
||||
WFIFOW(fd,4) = hd->homunculus.hskill[idx].lv;
|
||||
WFIFOW(fd,6) = skill_get_sp(skill_id,hd->homunculus.hskill[idx].lv);
|
||||
WFIFOW(fd,8) = skill_get_range2(&hd->bl, skill_id,hd->homunculus.hskill[idx].lv);
|
||||
WFIFOW(fd,8) = skill_get_range2(&hd->bl,skill_id,hd->homunculus.hskill[idx].lv,false);
|
||||
WFIFOB(fd,10) = (hd->homunculus.level < hom_skill_get_min_level(hd->homunculus.class_, skill_id) || hd->homunculus.hskill[idx].lv >= hom_skill_tree_get_max(hd->homunculus.hskill[idx].id, hd->homunculus.class_)) ? 0 : 1;
|
||||
WFIFOSET(fd,packet_len(0x239));
|
||||
}
|
||||
@ -5168,7 +5168,7 @@ void clif_skillinfoblock(struct map_session_data *sd)
|
||||
WFIFOL(fd,len+2) = skill_get_inf(id);
|
||||
WFIFOW(fd,len+6) = sd->status.skill[i].lv;
|
||||
WFIFOW(fd,len+8) = skill_get_sp(id,sd->status.skill[i].lv);
|
||||
WFIFOW(fd,len+10)= skill_get_range2(&sd->bl, id,sd->status.skill[i].lv);
|
||||
WFIFOW(fd,len+10)= skill_get_range2(&sd->bl,id,sd->status.skill[i].lv,false);
|
||||
safestrncpy((char*)WFIFOP(fd,len+12), skill_get_name(id), NAME_LENGTH);
|
||||
if(sd->status.skill[i].flag == SKILL_FLAG_PERMANENT)
|
||||
WFIFOB(fd,len+36) = (sd->status.skill[i].lv < skill_tree_get_max(id, sd->status.class_))? 1:0;
|
||||
@ -5216,7 +5216,7 @@ void clif_addskill(struct map_session_data *sd, int skill_id)
|
||||
WFIFOL(fd,4) = skill_get_inf(skill_id);
|
||||
WFIFOW(fd,8) = sd->status.skill[idx].lv;
|
||||
WFIFOW(fd,10) = skill_get_sp(skill_id,sd->status.skill[idx].lv);
|
||||
WFIFOW(fd,12)= skill_get_range2(&sd->bl, skill_id,sd->status.skill[idx].lv);
|
||||
WFIFOW(fd,12)= skill_get_range2(&sd->bl,skill_id,sd->status.skill[idx].lv,false);
|
||||
safestrncpy((char*)WFIFOP(fd,14), skill_get_name(skill_id), NAME_LENGTH);
|
||||
if( sd->status.skill[idx].flag == SKILL_FLAG_PERMANENT )
|
||||
WFIFOB(fd,38) = (sd->status.skill[idx].lv < skill_tree_get_max(skill_id, sd->status.class_))? 1:0;
|
||||
@ -5282,7 +5282,7 @@ void clif_skillinfo(struct map_session_data *sd,int skill_id, int inf)
|
||||
WFIFOL(fd,4) = inf?inf:skill_get_inf(skill_id);
|
||||
WFIFOW(fd,8) = sd->status.skill[idx].lv;
|
||||
WFIFOW(fd,10) = skill_get_sp(skill_id,sd->status.skill[idx].lv);
|
||||
WFIFOW(fd,12) = skill_get_range2(&sd->bl,skill_id,sd->status.skill[idx].lv);
|
||||
WFIFOW(fd,12) = skill_get_range2(&sd->bl,skill_id,sd->status.skill[idx].lv,false);
|
||||
if( sd->status.skill[idx].flag == SKILL_FLAG_PERMANENT )
|
||||
WFIFOB(fd,14) = (sd->status.skill[idx].lv < skill_tree_get_max(skill_id, sd->status.class_))? 1:0;
|
||||
else
|
||||
@ -6597,7 +6597,7 @@ void clif_item_skill(struct map_session_data *sd,uint16 skill_id,uint16 skill_lv
|
||||
WFIFOW(fd, 6)=0;
|
||||
WFIFOW(fd, 8)=skill_lv;
|
||||
WFIFOW(fd,10)=skill_get_sp(skill_id,skill_lv);
|
||||
WFIFOW(fd,12)=skill_get_range2(&sd->bl, skill_id,skill_lv);
|
||||
WFIFOW(fd,12)=skill_get_range2(&sd->bl,skill_id,skill_lv,false);
|
||||
safestrncpy((char*)WFIFOP(fd,14),skill_get_name(skill_id),NAME_LENGTH);
|
||||
WFIFOB(fd,38)=0;
|
||||
WFIFOSET(fd,packet_len(0x147));
|
||||
@ -7796,7 +7796,7 @@ void clif_devotion(struct block_list *src, struct map_session_data *tsd)
|
||||
if( md && md->master && md->devotion_flag )
|
||||
WBUFL(buf,6) = md->master->bl.id;
|
||||
|
||||
WBUFW(buf,26) = skill_get_range2(src, ML_DEVOTION, mercenary_checkskill(md, ML_DEVOTION));
|
||||
WBUFW(buf,26) = skill_get_range2(src, ML_DEVOTION, mercenary_checkskill(md, ML_DEVOTION), false);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -7807,7 +7807,7 @@ void clif_devotion(struct block_list *src, struct map_session_data *tsd)
|
||||
|
||||
for( i = 0; i < 5 /*MAX_DEVOTION*/; i++ ) // Client only able show to 5 links
|
||||
WBUFL(buf,6+4*i) = sd->devotion[i];
|
||||
WBUFW(buf,26) = skill_get_range2(src, CR_DEVOTION, pc_checkskill(sd, CR_DEVOTION));
|
||||
WBUFW(buf,26) = skill_get_range2(src, CR_DEVOTION, pc_checkskill(sd, CR_DEVOTION), false);
|
||||
}
|
||||
|
||||
if( tsd )
|
||||
@ -16296,7 +16296,7 @@ void clif_mercenary_skillblock(struct map_session_data *sd)
|
||||
WFIFOL(fd,len+2) = skill_get_inf(id);
|
||||
WFIFOW(fd,len+6) = md->db->skill[idx].lv;
|
||||
WFIFOW(fd,len+8) = skill_get_sp(id, md->db->skill[idx].lv);
|
||||
WFIFOW(fd,len+10) = skill_get_range2(&md->bl, id, md->db->skill[idx].lv);
|
||||
WFIFOW(fd,len+10) = skill_get_range2(&md->bl, id, md->db->skill[idx].lv, false);
|
||||
safestrncpy((char*)WFIFOP(fd,len+12), skill_get_name(id), NAME_LENGTH);
|
||||
WFIFOB(fd,len+36) = 0; // Skillable for Mercenary?
|
||||
len += 37;
|
||||
|
@ -3369,7 +3369,7 @@ int mobskill_use(struct mob_data *md, unsigned int tick, int event)
|
||||
switch (skill_target) {
|
||||
case MST_RANDOM: //Pick a random enemy within skill range.
|
||||
bl = battle_getenemy(&md->bl, DEFAULT_ENEMY_TYPE(md),
|
||||
skill_get_range2(&md->bl, ms[i].skill_id, ms[i].skill_lv));
|
||||
skill_get_range2(&md->bl, ms[i].skill_id, ms[i].skill_lv, true));
|
||||
break;
|
||||
case MST_TARGET:
|
||||
case MST_AROUND5:
|
||||
@ -3404,8 +3404,8 @@ int mobskill_use(struct mob_data *md, unsigned int tick, int event)
|
||||
}
|
||||
md->skill_idx = i;
|
||||
map_freeblock_lock();
|
||||
if( !battle_check_range(&md->bl,bl,skill_get_range2(&md->bl, ms[i].skill_id,ms[i].skill_lv)) ||
|
||||
!unit_skilluse_pos2(&md->bl, x, y,ms[i].skill_id, ms[i].skill_lv,ms[i].casttime, ms[i].cancel) )
|
||||
if (!battle_check_range(&md->bl, bl, skill_get_range2(&md->bl, ms[i].skill_id, ms[i].skill_lv, true)) ||
|
||||
!unit_skilluse_pos2(&md->bl, x, y, ms[i].skill_id, ms[i].skill_lv, ms[i].casttime, ms[i].cancel))
|
||||
{
|
||||
map_freeblock_unlock();
|
||||
continue;
|
||||
@ -3415,7 +3415,7 @@ int mobskill_use(struct mob_data *md, unsigned int tick, int event)
|
||||
switch (skill_target) {
|
||||
case MST_RANDOM: //Pick a random enemy within skill range.
|
||||
bl = battle_getenemy(&md->bl, DEFAULT_ENEMY_TYPE(md),
|
||||
skill_get_range2(&md->bl, ms[i].skill_id, ms[i].skill_lv));
|
||||
skill_get_range2(&md->bl, ms[i].skill_id, ms[i].skill_lv, true));
|
||||
break;
|
||||
case MST_TARGET:
|
||||
bl = map_id2bl(md->target_id);
|
||||
@ -3442,8 +3442,8 @@ int mobskill_use(struct mob_data *md, unsigned int tick, int event)
|
||||
|
||||
md->skill_idx = i;
|
||||
map_freeblock_lock();
|
||||
if( !battle_check_range(&md->bl,bl,skill_get_range2(&md->bl, ms[i].skill_id,ms[i].skill_lv)) ||
|
||||
!unit_skilluse_id2(&md->bl, bl->id,ms[i].skill_id, ms[i].skill_lv,ms[i].casttime, ms[i].cancel) )
|
||||
if (!battle_check_range(&md->bl, bl, skill_get_range2(&md->bl, ms[i].skill_id, ms[i].skill_lv, true)) ||
|
||||
!unit_skilluse_id2(&md->bl, bl->id, ms[i].skill_id, ms[i].skill_lv, ms[i].casttime, ms[i].cancel))
|
||||
{
|
||||
map_freeblock_unlock();
|
||||
continue;
|
||||
|
@ -247,6 +247,7 @@ static int add_path(struct node_heap *heap, struct path_node *tp, int16 x, int16
|
||||
* path search (x0,y0)->(x1,y1)
|
||||
* wpd: path info will be written here
|
||||
* flag: &1 = easy path search only
|
||||
* flag: &2 = call path_search_long instead
|
||||
* cell: type of obstruction to check for
|
||||
*------------------------------------------*/
|
||||
bool path_search(struct walkpath_data *wpd, int16 m, int16 x0, int16 y0, int16 x1, int16 y1, int flag, cell_chk cell)
|
||||
@ -255,6 +256,9 @@ bool path_search(struct walkpath_data *wpd, int16 m, int16 x0, int16 y0, int16 x
|
||||
struct map_data *md;
|
||||
struct walkpath_data s_wpd;
|
||||
|
||||
if (flag&2)
|
||||
return path_search_long(NULL, m, x0, y0, x1, y1, cell);
|
||||
|
||||
if (wpd == NULL)
|
||||
wpd = &s_wpd; // use dummy output variable
|
||||
|
||||
|
@ -6856,7 +6856,7 @@ void pc_skillup(struct map_session_data *sd,uint16 skill_id)
|
||||
pc_check_skilltree(sd); // Check if a new skill can Lvlup
|
||||
|
||||
lv = sd->status.skill[idx].lv;
|
||||
range = skill_get_range2(&sd->bl, skill_id, lv);
|
||||
range = skill_get_range2(&sd->bl, skill_id, lv, false);
|
||||
upgradable = (lv < skill_tree_get_max(sd->status.skill[idx].id, sd->status.class_)) ? 1 : 0;
|
||||
clif_skillup(sd,skill_id,lv,range,upgradable);
|
||||
clif_updatestatus(sd,SP_SKILLPOINT);
|
||||
|
@ -19161,7 +19161,7 @@ static int buildin_mobuseskill_sub(struct block_list *bl,va_list ap)
|
||||
case 0: tbl = map_id2bl(md->bl.id); break;
|
||||
case 1: tbl = map_id2bl(md->target_id); break;
|
||||
case 2: tbl = map_id2bl(md->master_id); break;
|
||||
default:tbl = battle_getenemy(&md->bl, DEFAULT_ENEMY_TYPE(md),skill_get_range2(&md->bl, skill_id, skill_lv)); break;
|
||||
default:tbl = battle_getenemy(&md->bl, DEFAULT_ENEMY_TYPE(md), skill_get_range2(&md->bl, skill_id, skill_lv, true)); break;
|
||||
}
|
||||
|
||||
if( !tbl )
|
||||
|
@ -343,7 +343,7 @@ int skill_get_casttype (uint16 skill_id) {
|
||||
}
|
||||
|
||||
//Returns actual skill range taking into account attack range and AC_OWL [Skotlex]
|
||||
int skill_get_range2 (struct block_list *bl, uint16 skill_id, uint16 skill_lv) {
|
||||
int skill_get_range2(struct block_list *bl, uint16 skill_id, uint16 skill_lv, bool isServer) {
|
||||
int range, inf3=0;
|
||||
if( bl->type == BL_MOB && battle_config.mob_ai&0x400 )
|
||||
return 9; //Mobs have a range of 9 regardless of skill used.
|
||||
@ -355,8 +355,12 @@ int skill_get_range2 (struct block_list *bl, uint16 skill_id, uint16 skill_lv) {
|
||||
return status_get_range(bl);
|
||||
range *=-1;
|
||||
}
|
||||
inf3 = skill_get_inf3(skill_id);
|
||||
|
||||
if (isServer && range > 14) {
|
||||
range = 14; // Server-sided base range can't be above 14
|
||||
}
|
||||
|
||||
inf3 = skill_get_inf3(skill_id);
|
||||
if(inf3&(INF3_EFF_VULTURE|INF3_EFF_SNAKEEYE) ){
|
||||
if( bl->type == BL_PC ) {
|
||||
if(inf3&INF3_EFF_VULTURE) range += pc_checkskill((TBL_PC*)bl, AC_VULTURE);
|
||||
@ -365,7 +369,6 @@ int skill_get_range2 (struct block_list *bl, uint16 skill_id, uint16 skill_lv) {
|
||||
} else
|
||||
range += battle_config.mob_eye_range_bonus;
|
||||
}
|
||||
|
||||
if(inf3&(INF3_EFF_SHADOWJUMP|INF3_EFF_RADIUS|INF3_EFF_RESEARCHTRAP) ){
|
||||
if( bl->type == BL_PC ) {
|
||||
if(inf3&INF3_EFF_SHADOWJUMP) range = skill_get_range(NJ_SHADOWJUMP,pc_checkskill((TBL_PC*)bl,NJ_SHADOWJUMP));
|
||||
@ -1989,8 +1992,8 @@ int skill_additional_effect(struct block_list* src, struct block_list *bl, uint1
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if( battle_config.autospell_check_range &&
|
||||
!battle_check_range(src, tbl, skill_get_range2(src, skill,autospl_skill_lv) + (skill == RG_CLOSECONFINE?0:1)) )
|
||||
if (battle_config.autospell_check_range &&
|
||||
!battle_check_range(src, tbl, skill_get_range2(src, skill, autospl_skill_lv, true)))
|
||||
continue;
|
||||
|
||||
if (skill == AS_SONICBLOW)
|
||||
@ -2118,8 +2121,8 @@ int skill_onskillusage(struct map_session_data *sd, struct block_list *bl, uint1
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if( battle_config.autospell_check_range &&
|
||||
!battle_check_range(&sd->bl, tbl, skill_get_range2(&sd->bl, skill,skill_lv) + (skill == RG_CLOSECONFINE?0:1)) )
|
||||
if (battle_config.autospell_check_range &&
|
||||
!battle_check_range(&sd->bl, tbl, skill_get_range2(&sd->bl, skill, skill_lv, true)))
|
||||
continue;
|
||||
|
||||
sd->state.autocast = 1;
|
||||
@ -2330,7 +2333,7 @@ int skill_counter_additional_effect (struct block_list* src, struct block_list *
|
||||
}
|
||||
}
|
||||
|
||||
if( !battle_check_range(src, tbl, skill_get_range2(src, autospl_skill_id,autospl_skill_lv) + (autospl_skill_id == RG_CLOSECONFINE?0:1)) && battle_config.autospell_check_range )
|
||||
if (!battle_check_range(src, tbl, skill_get_range2(src, autospl_skill_id, autospl_skill_lv, true)) && battle_config.autospell_check_range)
|
||||
continue;
|
||||
|
||||
dstsd->state.autocast = 1;
|
||||
@ -6298,7 +6301,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
case TK_JUMPKICK:
|
||||
/* Check if the target is an enemy; if not, skill should fail so the character doesn't unit_movepos (exploitable) */
|
||||
if( battle_check_target(src, bl, BCT_ENEMY) > 0 ) {
|
||||
if( unit_movepos(src, bl->x, bl->y, 1, 1) ) {
|
||||
if( unit_movepos(src, bl->x, bl->y, 2, 1) ) {
|
||||
skill_attack(BF_WEAPON,src,src,bl,skill_id,skill_lv,tick,flag);
|
||||
clif_blown(src);
|
||||
}
|
||||
@ -6566,7 +6569,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
if( dstmd )
|
||||
{
|
||||
dstmd->state.provoke_flag = src->id;
|
||||
mob_target(dstmd, src, skill_get_range2(src,skill_id,skill_lv));
|
||||
mob_target(dstmd, src, skill_get_range2(src, skill_id, skill_lv, true));
|
||||
}
|
||||
break;
|
||||
|
||||
@ -6617,7 +6620,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
mer->devotion_flag = 1; // Mercenary Devoting Owner
|
||||
|
||||
clif_skill_nodamage(src, bl, skill_id, skill_lv,
|
||||
sc_start4(src, bl, type, 10000, src->id, i, skill_get_range2(src,skill_id,skill_lv), 0, skill_get_time2(skill_id, skill_lv)));
|
||||
sc_start4(src, bl, type, 10000, src->id, i, skill_get_range2(src, skill_id, skill_lv, true), 0, skill_get_time2(skill_id, skill_lv)));
|
||||
clif_devotion(src, NULL);
|
||||
}
|
||||
break;
|
||||
@ -7025,7 +7028,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
if(pc_steal_coin(sd,bl))
|
||||
{
|
||||
dstmd->state.provoke_flag = src->id;
|
||||
mob_target(dstmd, src, skill_get_range2(src,skill_id,skill_lv));
|
||||
mob_target(dstmd, src, skill_get_range2(src, skill_id, skill_lv, true));
|
||||
clif_skill_nodamage(src,bl,skill_id,skill_lv,1);
|
||||
|
||||
}
|
||||
@ -8169,8 +8172,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
||||
status_change_end(bl, SC_SLEEP, INVALID_TIMER);
|
||||
}
|
||||
|
||||
if(dstmd)
|
||||
mob_target(dstmd,src,skill_get_range2(src,skill_id,skill_lv));
|
||||
if (dstmd)
|
||||
mob_target(dstmd, src, skill_get_range2(src, skill_id, skill_lv, true));
|
||||
}
|
||||
break;
|
||||
|
||||
@ -10964,13 +10967,13 @@ int skill_castend_id(int tid, unsigned int tick, int id, intptr_t data)
|
||||
clif_emotion(src, md->db->skill[md->skill_idx].emotion);
|
||||
}
|
||||
|
||||
if(src != target && battle_config.skill_add_range &&
|
||||
!check_distance_bl(src, target, skill_get_range2(src,ud->skill_id,ud->skill_lv)+battle_config.skill_add_range))
|
||||
if (src != target && battle_config.skill_add_range &&
|
||||
!check_distance_bl(src, target, skill_get_range2(src, ud->skill_id, ud->skill_lv, true) + battle_config.skill_add_range))
|
||||
{
|
||||
if (sd) {
|
||||
clif_skill_fail(sd,ud->skill_id,USESKILL_FAIL_LEVEL,0);
|
||||
if(battle_config.skill_out_range_consume) //Consume items anyway. [Skotlex]
|
||||
skill_consume_requirement(sd,ud->skill_id,ud->skill_lv,3);
|
||||
clif_skill_fail(sd, ud->skill_id, USESKILL_FAIL_LEVEL, 0);
|
||||
if (battle_config.skill_out_range_consume) //Consume items anyway. [Skotlex]
|
||||
skill_consume_requirement(sd, ud->skill_id, ud->skill_lv, 3);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -11201,10 +11204,10 @@ int skill_castend_pos(int tid, unsigned int tick, int id, intptr_t data)
|
||||
{ //Avoid double checks on instant cast skills. [Skotlex]
|
||||
if (!status_check_skilluse(src, NULL, ud->skill_id, 1))
|
||||
break;
|
||||
if(battle_config.skill_add_range &&
|
||||
!check_distance_blxy(src, ud->skillx, ud->skilly, skill_get_range2(src,ud->skill_id,ud->skill_lv)+battle_config.skill_add_range)) {
|
||||
if (battle_config.skill_add_range &&
|
||||
!check_distance_blxy(src, ud->skillx, ud->skilly, skill_get_range2(src, ud->skill_id, ud->skill_lv, true) + battle_config.skill_add_range)) {
|
||||
if (sd && battle_config.skill_out_range_consume) //Consume items anyway.
|
||||
skill_consume_requirement(sd,ud->skill_id,ud->skill_lv,3);
|
||||
skill_consume_requirement(sd, ud->skill_id, ud->skill_lv, 3);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -11577,7 +11580,7 @@ int skill_castend_pos2(struct block_list* src, int x, int y, uint16 skill_id, ui
|
||||
return 0; // not to consume item.
|
||||
|
||||
case MO_BODYRELOCATION:
|
||||
if (unit_movepos(src, x, y, 1, 1)) {
|
||||
if (unit_movepos(src, x, y, 2, 1)) {
|
||||
#if PACKETVER >= 20111005
|
||||
clif_snap(src, src->x, src->y);
|
||||
#else
|
||||
@ -16277,8 +16280,8 @@ void skill_repairweapon(struct map_session_data *sd, int idx) {
|
||||
if( !item->nameid || !item->attribute )
|
||||
return; //Again invalid item....
|
||||
|
||||
if( sd != target_sd && !battle_check_range(&sd->bl,&target_sd->bl, skill_get_range2(&sd->bl, sd->menuskill_id,sd->menuskill_val2) ) ){
|
||||
clif_item_repaireffect(sd,idx,1);
|
||||
if (sd != target_sd && !battle_check_range(&sd->bl, &target_sd->bl, skill_get_range2(&sd->bl, sd->menuskill_id, sd->menuskill_val2, true))) {
|
||||
clif_item_repaireffect(sd, idx, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -375,7 +375,7 @@ int skill_get_ele( uint16 skill_id , uint16 skill_lv );
|
||||
int skill_get_nk( uint16 skill_id );
|
||||
int skill_get_max( uint16 skill_id );
|
||||
int skill_get_range( uint16 skill_id , uint16 skill_lv );
|
||||
int skill_get_range2(struct block_list *bl, uint16 skill_id, uint16 skill_lv);
|
||||
int skill_get_range2(struct block_list *bl, uint16 skill_id, uint16 skill_lv, bool isServer);
|
||||
int skill_get_splash( uint16 skill_id , uint16 skill_lv );
|
||||
int skill_get_num( uint16 skill_id ,uint16 skill_lv );
|
||||
int skill_get_cast( uint16 skill_id ,uint16 skill_lv );
|
||||
|
@ -11225,8 +11225,8 @@ int status_change_end_(struct block_list* bl, enum sc_type type, int tid, const
|
||||
if (sce->val2 > 0) {
|
||||
// Caster has been unlocked... nearby chars need to be unlocked.
|
||||
int range = 1
|
||||
+skill_get_range2(bl, status_sc2skill(type), sce->val1)
|
||||
+skill_get_range2(bl, TF_BACKSLIDING, 1); // Since most people use this to escape the hold....
|
||||
+ skill_get_range2(bl, status_sc2skill(type), sce->val1, true)
|
||||
+ skill_get_range2(bl, TF_BACKSLIDING, 1, true); // Since most people use this to escape the hold....
|
||||
map_foreachinarea(status_change_timer_sub,
|
||||
bl->m, bl->x-range, bl->y-range, bl->x+range,bl->y+range,BL_CHAR,bl,sce,type,gettick());
|
||||
}
|
||||
|
@ -898,7 +898,10 @@ int unit_escape(struct block_list *bl, struct block_list *target, short dist)
|
||||
* @param bl: Object to instant warp
|
||||
* @param dst_x: X coordinate to warp to
|
||||
* @param dst_y: Y coordinate to warp to
|
||||
* @param easy: Easy(1) or Hard(0) path check (hard attempts to go around obstacles)
|
||||
* @param easy:
|
||||
* 0: Hard path check (attempt to go around obstacle)
|
||||
* 1: Easy path check (no obstacle on movement path)
|
||||
* 2: Long path check (no obstacle on line from start to destination)
|
||||
* @param checkpath: Whether or not to do a cell and path check for NOPASS and NOREACH
|
||||
* @return True: Success False: Fail
|
||||
*/
|
||||
@ -1691,7 +1694,7 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
|
||||
if (src->type == BL_NPC) // NPC-objects can override cast distance
|
||||
range = AREA_SIZE; // Maximum visible distance before NPC goes out of sight
|
||||
else
|
||||
range = skill_get_range2(src, skill_id, skill_lv); // Skill cast distance from database
|
||||
range = skill_get_range2(src, skill_id, skill_lv, true); // Skill cast distance from database
|
||||
|
||||
// New action request received, delete previous action request if not executed yet
|
||||
if(ud->stepaction || ud->steptimer != INVALID_TIMER)
|
||||
@ -1994,7 +1997,7 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, ui
|
||||
if (src->type == BL_NPC) // NPC-objects can override cast distance
|
||||
range = AREA_SIZE; // Maximum visible distance before NPC goes out of sight
|
||||
else
|
||||
range = skill_get_range2(src, skill_id, skill_lv); // Skill cast distance from database
|
||||
range = skill_get_range2(src, skill_id, skill_lv, true); // Skill cast distance from database
|
||||
|
||||
// New action request received, delete previous action request if not executed yet
|
||||
if(ud->stepaction || ud->steptimer != INVALID_TIMER)
|
||||
|
Loading…
x
Reference in New Issue
Block a user