diff --git a/src/map/battle.c b/src/map/battle.c index 4df9fea75a..f4e57c494a 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -6997,21 +6997,21 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t } } - if (sd->state.autocast == 0) { - sd->state.autocast = 1; - skill_consume_requirement(sd, r_skill, r_lv, 3); - switch (type) { - case CAST_GROUND: - skill_castend_pos2(src, target->x, target->y, r_skill, r_lv, tick, flag); - break; - case CAST_NODAMAGE: - skill_castend_nodamage_id(src, target, r_skill, r_lv, tick, flag); - break; - case CAST_DAMAGE: - skill_castend_damage_id(src, target, r_skill, r_lv, tick, flag); - break; - } - } + if (sd->state.autocast == 0) { + sd->state.autocast = 1; + skill_consume_requirement(sd, r_skill, r_lv, 3); + switch (type) { + case CAST_GROUND: + skill_castend_pos2(src, target->x, target->y, r_skill, r_lv, tick, flag); + break; + case CAST_NODAMAGE: + skill_castend_nodamage_id(src, target, r_skill, r_lv, tick, flag); + break; + case CAST_DAMAGE: + skill_castend_damage_id(src, target, r_skill, r_lv, tick, flag); + break; + } + } sd->state.autocast = 0; sd->ud.canact_tick = tick + skill_delayfix(src, r_skill, r_lv); diff --git a/src/map/skill.c b/src/map/skill.c index 4e04bb5997..cf5ee43bf8 100755 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -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 ) { diff --git a/src/map/unit.c b/src/map/unit.c index c22e40038c..d592b8b396 100644 --- a/src/map/unit.c +++ b/src/map/unit.c @@ -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);