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

@ -6997,21 +6997,21 @@ enum damage_lv battle_weapon_attack(struct block_list* src, struct block_list* t
} }
} }
if (sd->state.autocast == 0) { if (sd->state.autocast == 0) {
sd->state.autocast = 1; sd->state.autocast = 1;
skill_consume_requirement(sd, r_skill, r_lv, 3); skill_consume_requirement(sd, r_skill, r_lv, 3);
switch (type) { switch (type) {
case CAST_GROUND: case CAST_GROUND:
skill_castend_pos2(src, target->x, target->y, r_skill, r_lv, tick, flag); skill_castend_pos2(src, target->x, target->y, r_skill, r_lv, tick, flag);
break; break;
case CAST_NODAMAGE: case CAST_NODAMAGE:
skill_castend_nodamage_id(src, target, r_skill, r_lv, tick, flag); skill_castend_nodamage_id(src, target, r_skill, r_lv, tick, flag);
break; break;
case CAST_DAMAGE: case CAST_DAMAGE:
skill_castend_damage_id(src, target, r_skill, r_lv, tick, flag); skill_castend_damage_id(src, target, r_skill, r_lv, tick, flag);
break; break;
} }
} }
sd->state.autocast = 0; sd->state.autocast = 0;
sd->ud.canact_tick = tick + skill_delayfix(src, r_skill, r_lv); sd->ud.canact_tick = tick + skill_delayfix(src, r_skill, r_lv);

View File

@ -10514,21 +10514,16 @@ int skill_castend_id(int tid, unsigned int tick, int id, intptr_t data)
break; break;
} }
} }
else if( ud->skill_id == PR_TURNUNDEAD ) {
if( ud->skill_id == PR_TURNUNDEAD )
{
struct status_data *tstatus = status_get_status_data(target); struct status_data *tstatus = status_get_status_data(target);
if( !battle_check_undead(tstatus->race, tstatus->def_ele) ) if( !battle_check_undead(tstatus->race, tstatus->def_ele) )
break; break;
} }
else if( ud->skill_id == RA_WUGSTRIKE ){
if( ud->skill_id == RA_WUGSTRIKE ){
if( !path_search(NULL,src->m,src->x,src->y,target->x,target->y,1,CELL_CHKNOREACH)) if( !path_search(NULL,src->m,src->x,src->y,target->x,target->y,1,CELL_CHKNOREACH))
break; break;
} }
else if( ud->skill_id == PR_LEXDIVINA || ud->skill_id == MER_LEXDIVINA ) {
if( ud->skill_id == PR_LEXDIVINA || ud->skill_id == MER_LEXDIVINA )
{
sc = status_get_sc(target); sc = status_get_sc(target);
if( battle_check_target(src,target, BCT_ENEMY) <= 0 && (!sc || !sc->data[SC_SILENCE]) ) 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] { //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; break;
} }
} }
else else { // Check target validity.
{ // Check target validity.
inf = skill_get_inf(ud->skill_id); inf = skill_get_inf(ud->skill_id);
inf2 = skill_get_inf2(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; 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 ) if( ((TBL_MOB*)target)->mob_id == MOBID_EMPERIUM )
break; 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 ) { 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 ) 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] 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); clif_skill_fail(sd, ud->skill_id, USESKILL_FAIL_NEED_HELPER, 0);
break; 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)) && if(inf&BCT_ENEMY && (sc = status_get_sc(target)) &&
sc->data[SC_FOGWALL] && 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); 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; 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 ) { 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; struct block_list * target = NULL;
unsigned int tick = gettick(); unsigned int tick = gettick();
int combo = 0, range; int combo = 0, range;
uint8 inf = 0;
uint32 inf2 = 0;
nullpo_ret(src); 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) if (sc && !sc->count)
sc = NULL; // Unneeded sc = NULL; // Unneeded
inf = skill_get_inf(skill_id);
inf2 = skill_get_inf2(skill_id);
// temp: used to signal combo-skills right now. // temp: used to signal combo-skills right now.
if (sc && sc->data[SC_COMBO] && if (sc && sc->data[SC_COMBO] &&
skill_is_combo(skill_id) && 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) else if (target_id == src->id || ud->target > 0)
target_id = ud->target; 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; target_id = src->id;
combo = 1; combo = 1;
} else if ( target_id == src->id && } else if ( target_id == src->id &&
skill_get_inf(skill_id)&INF_SELF_SKILL && inf&INF_SELF_SKILL &&
(skill_get_inf2(skill_id)&INF2_NO_TARGET_SELF || (inf2&INF2_NO_TARGET_SELF ||
(skill_id == RL_QD_SHOT && sc && sc->data[SC_QD_SHOT_READY])) ) { (skill_id == RL_QD_SHOT && sc && sc->data[SC_QD_SHOT_READY])) ) {
target_id = ud->target; // Auto-select target. [Skotlex] target_id = ud->target; // Auto-select target. [Skotlex]
combo = 1; 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) if(ud->skilltimer != INVALID_TIMER && skill_id != SA_CASTCANCEL && skill_id != SO_SPELLFIST)
return 0; 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; return 0;
if(!status_check_skilluse(src, target, skill_id, 0)) if(!status_check_skilluse(src, target, skill_id, 0))
return 0; return 0;
// Fail if the targetted skill is near NPC [Cydh] // 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) if (sd)
clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0); clif_skill_fail(sd,skill_id,USESKILL_FAIL_LEVEL,0);