From b5de854b90353f2decf83a95fba8c19fbe641fb7 Mon Sep 17 00:00:00 2001 From: Playtester Date: Sun, 13 Mar 2016 16:42:46 +0100 Subject: [PATCH] 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 --- db/pre-re/skill_db.txt | 6 ++--- db/re/skill_db.txt | 6 ++--- src/map/battle.c | 2 +- src/map/clif.c | 18 +++++++------- src/map/mob.c | 12 +++++----- src/map/path.c | 4 ++++ src/map/pc.c | 2 +- src/map/script.c | 2 +- src/map/skill.c | 53 ++++++++++++++++++++++-------------------- src/map/skill.h | 2 +- src/map/status.c | 4 ++-- src/map/unit.c | 9 ++++--- 12 files changed, 65 insertions(+), 55 deletions(-) diff --git a/db/pre-re/skill_db.txt b/db/pre-re/skill_db.txt index fd0b5ea96c..3f2a158397 100644 --- a/db/pre-re/skill_db.txt +++ b/db/pre-re/skill_db.txt @@ -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 diff --git a/db/re/skill_db.txt b/db/re/skill_db.txt index 11a0fac42d..a90d84f8c2 100644 --- a/db/re/skill_db.txt +++ b/db/re/skill_db.txt @@ -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 diff --git a/src/map/battle.c b/src/map/battle.c index 0b6a0fa259..87861f0dee 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -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; } diff --git a/src/map/clif.c b/src/map/clif.c index 5b5fa00a5f..c00bed7c29 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -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; diff --git a/src/map/mob.c b/src/map/mob.c index a7984ccbda..e3520bfe2c 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -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; diff --git a/src/map/path.c b/src/map/path.c index b653da9d52..e20e48946d 100644 --- a/src/map/path.c +++ b/src/map/path.c @@ -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 diff --git a/src/map/pc.c b/src/map/pc.c index eb6fb56b25..a4f87404ca 100755 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -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); diff --git a/src/map/script.c b/src/map/script.c index 43392ad594..9a88bc4b8e 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -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 ) diff --git a/src/map/skill.c b/src/map/skill.c index 8c6e9b16c9..8f20a2ea81 100755 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -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; } diff --git a/src/map/skill.h b/src/map/skill.h index c93cbc5349..82d850e4c1 100644 --- a/src/map/skill.h +++ b/src/map/skill.h @@ -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 ); diff --git a/src/map/status.c b/src/map/status.c index e1292dd968..dcf501dcf8 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -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()); } diff --git a/src/map/unit.c b/src/map/unit.c index 8e3d3fbe1d..426673b322 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -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)