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:
parent
739a8f5831
commit
46f010cb28
@ -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);
|
||||
|
@ -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 ) {
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user