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:
Playtester 2016-03-13 16:42:46 +01:00
parent fbb8edba39
commit b5de854b90
12 changed files with 65 additions and 55 deletions

View File

@ -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

View File

@ -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

View File

@ -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;
}

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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);

View File

@ -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 )

View File

@ -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;
}

View File

@ -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 );

View File

@ -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());
}

View File

@ -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)