Bug fixes:

* #331: Fixed Auto Shadow Spell always failed, 9d3d34205fdb424e4a9281c3e6a951a1f0cdbdc1 fault
* #340: Phantom Thrust can be used to pull a party member

Signed-off-by: Cydh Ramdh <house.bad@gmail.com>
This commit is contained in:
Cydh Ramdh 2015-03-16 23:08:43 +07:00
parent 739a8f5831
commit 46f010cb28
3 changed files with 38 additions and 37 deletions

View File

@ -10514,21 +10514,16 @@ int skill_castend_id(int tid, unsigned int tick, int id, intptr_t data)
break;
}
}
if( ud->skill_id == PR_TURNUNDEAD )
{
else if( ud->skill_id == PR_TURNUNDEAD ) {
struct status_data *tstatus = status_get_status_data(target);
if( !battle_check_undead(tstatus->race, tstatus->def_ele) )
break;
}
if( ud->skill_id == RA_WUGSTRIKE ){
else if( ud->skill_id == RA_WUGSTRIKE ){
if( !path_search(NULL,src->m,src->x,src->y,target->x,target->y,1,CELL_CHKNOREACH))
break;
}
if( ud->skill_id == PR_LEXDIVINA || ud->skill_id == MER_LEXDIVINA )
{
else if( ud->skill_id == PR_LEXDIVINA || ud->skill_id == MER_LEXDIVINA ) {
sc = status_get_sc(target);
if( battle_check_target(src,target, BCT_ENEMY) <= 0 && (!sc || !sc->data[SC_SILENCE]) )
{ //If it's not an enemy, and not silenced, you can't use the skill on them. [Skotlex]
@ -10536,8 +10531,7 @@ int skill_castend_id(int tid, unsigned int tick, int id, intptr_t data)
break;
}
}
else
{ // Check target validity.
else { // Check target validity.
inf = skill_get_inf(ud->skill_id);
inf2 = skill_get_inf2(ud->skill_id);
@ -10559,15 +10553,11 @@ int skill_castend_id(int tid, unsigned int tick, int id, intptr_t data)
inf &= ~BCT_NEUTRAL;
}
if( ud->skill_id >= SL_SKE && ud->skill_id <= SL_SKA && target->type == BL_MOB )
{
// Specific skill check first
if( ud->skill_id >= SL_SKE && ud->skill_id <= SL_SKA && target->type == BL_MOB ) {
if( ((TBL_MOB*)target)->mob_id == MOBID_EMPERIUM )
break;
}
else if (inf && battle_check_target(src, target, inf) <= 0){
if (sd) clif_skill_fail(sd,ud->skill_id,USESKILL_FAIL_LEVEL,0);
break;
}
else if( ud->skill_id == RK_PHANTOMTHRUST && target->type != BL_MOB ) {
if( !map_flag_vs(src->m) && battle_check_target(src,target,BCT_PARTY) <= 0 )
break; // You can use Phantom Thurst on party members in normal maps too. [pakpil]
@ -10580,6 +10570,12 @@ int skill_castend_id(int tid, unsigned int tick, int id, intptr_t data)
clif_skill_fail(sd, ud->skill_id, USESKILL_FAIL_NEED_HELPER, 0);
break;
}
// Common check
else if (inf && battle_check_target(src, target, inf) <= 0){
if (sd)
clif_skill_fail(sd,ud->skill_id,USESKILL_FAIL_LEVEL,0);
break;
}
if(inf&BCT_ENEMY && (sc = status_get_sc(target)) &&
sc->data[SC_FOGWALL] &&
@ -18912,7 +18908,7 @@ int skill_select_menu(struct map_session_data *sd,uint16 skill_id) {
status_change_end(&sd->bl,SC_STOP,INVALID_TIMER);
}
if (!skill_id || (sk_idx = skill_get_index(skill_id)))
if (!skill_id || !(sk_idx = skill_get_index(skill_id)))
return 0;
if( !(skill_get_inf2(skill_id)&INF2_AUTOSHADOWSPELL) || (id = sd->status.skill[sk_idx].id) == 0 || sd->status.skill[sk_idx].flag != SKILL_FLAG_PLAGIARIZED ) {

View File

@ -1482,6 +1482,8 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
struct block_list * target = NULL;
unsigned int tick = gettick();
int combo = 0, range;
uint8 inf = 0;
uint32 inf2 = 0;
nullpo_ret(src);
@ -1499,6 +1501,9 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
if (sc && !sc->count)
sc = NULL; // Unneeded
inf = skill_get_inf(skill_id);
inf2 = skill_get_inf2(skill_id);
// temp: used to signal combo-skills right now.
if (sc && sc->data[SC_COMBO] &&
skill_is_combo(skill_id) &&
@ -1509,13 +1514,13 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
else if (target_id == src->id || ud->target > 0)
target_id = ud->target;
if( skill_get_inf(skill_id)&INF_SELF_SKILL && skill_get_nk(skill_id)&NK_NO_DAMAGE )// exploit fix
if( inf&INF_SELF_SKILL && skill_get_nk(skill_id)&NK_NO_DAMAGE )// exploit fix
target_id = src->id;
combo = 1;
} else if ( target_id == src->id &&
skill_get_inf(skill_id)&INF_SELF_SKILL &&
(skill_get_inf2(skill_id)&INF2_NO_TARGET_SELF ||
inf&INF_SELF_SKILL &&
(inf2&INF2_NO_TARGET_SELF ||
(skill_id == RL_QD_SHOT && sc && sc->data[SC_QD_SHOT_READY])) ) {
target_id = ud->target; // Auto-select target. [Skotlex]
combo = 1;
@ -1589,14 +1594,14 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
if(ud->skilltimer != INVALID_TIMER && skill_id != SA_CASTCANCEL && skill_id != SO_SPELLFIST)
return 0;
if(skill_get_inf2(skill_id)&INF2_NO_TARGET_SELF && src->id == target_id)
if(inf2&INF2_NO_TARGET_SELF && src->id == target_id)
return 0;
if(!status_check_skilluse(src, target, skill_id, 0))
return 0;
// Fail if the targetted skill is near NPC [Cydh]
if(skill_get_inf2(skill_id)&INF2_NO_NEARNPC && skill_isNotOk_npcRange(src,skill_id,skill_lv,target->x,target->y)) {
if(inf2&INF2_NO_NEARNPC && skill_isNotOk_npcRange(src,skill_id,skill_lv,target->x,target->y)) {
if (sd)
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);