* Fixed 'bAutoSpellOnSkill' (bugreport:8124)
This commit is contained in:
parent
9cb9bb1576
commit
04f13d8407
@ -1693,51 +1693,55 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint
|
||||
}
|
||||
|
||||
int skill_onskillusage(struct map_session_data *sd, struct block_list *bl, uint16 skill_id, unsigned int tick) {
|
||||
int skill, skill_lv, i, type;
|
||||
uint8 i;
|
||||
struct block_list *tbl;
|
||||
|
||||
if( sd == NULL || !skill_id )
|
||||
return 0;
|
||||
|
||||
for( i = 0; i < ARRAYLENGTH(sd->autospell3) && sd->autospell3[i].flag; i++ ) {
|
||||
int skill, skill_lv, type;
|
||||
if( sd->autospell3[i].flag != skill_id )
|
||||
continue;
|
||||
|
||||
if( sd->autospell3[i].lock )
|
||||
continue; // autospell already being executed
|
||||
|
||||
skill = (sd->autospell3[i].id > 0) ? sd->autospell3[i].id : -sd->autospell3[i].id;
|
||||
skill = sd->autospell3[i].id;
|
||||
sd->state.autocast = 1; //set this to bypass sd->canskill_tick check
|
||||
|
||||
sd->state.autocast = 1;
|
||||
sd->state.autocast = 0;
|
||||
|
||||
if ( skill_isNotOk(skill, sd) )
|
||||
if( skill_isNotOk((skill > 0) ? skill : skill*-1, sd) )
|
||||
continue;
|
||||
|
||||
skill_lv = sd->autospell3[i].lv ? sd->autospell3[i].lv : 1;
|
||||
if( skill_lv < 0 ) skill_lv = 1 + rnd()%(-skill_lv);
|
||||
|
||||
if( sd->autospell3[i].id >= 0 && bl == NULL )
|
||||
sd->state.autocast = 0;
|
||||
|
||||
if( skill >= 0 && bl == NULL )
|
||||
continue; // No target
|
||||
if( rnd()%1000 >= sd->autospell3[i].rate )
|
||||
continue;
|
||||
|
||||
tbl = (sd->autospell3[i].id < 0) ? &sd->bl : bl;
|
||||
skill_lv = sd->autospell3[i].lv ? sd->autospell3[i].lv : 1;
|
||||
if( skill < 0 ) {
|
||||
tbl = &sd->bl;
|
||||
skill *= -1;
|
||||
skill_lv = 1 + rnd()%(-skill_lv); //random skill_lv
|
||||
}
|
||||
else
|
||||
tbl = bl;
|
||||
|
||||
if( (type = skill_get_casttype(skill)) == CAST_GROUND ) {
|
||||
int maxcount = 0;
|
||||
if( !(BL_PC&battle_config.skill_reiteration) &&
|
||||
skill_get_unit_flag(skill)&UF_NOREITERATION &&
|
||||
skill_check_unit_range(&sd->bl,tbl->x,tbl->y,skill,skill_lv)
|
||||
)
|
||||
skill_check_unit_range(&sd->bl,tbl->x,tbl->y,skill,skill_lv) )
|
||||
continue;
|
||||
if( BL_PC&battle_config.skill_nofootset &&
|
||||
skill_get_unit_flag(skill)&UF_NOFOOTSET &&
|
||||
skill_check_unit_range2(&sd->bl,tbl->x,tbl->y,skill,skill_lv,false)
|
||||
)
|
||||
skill_check_unit_range2(&sd->bl,tbl->x,tbl->y,skill,skill_lv,false) )
|
||||
continue;
|
||||
if( BL_PC&battle_config.land_skill_limit &&
|
||||
(maxcount = skill_get_maxcount(skill, skill_lv)) > 0
|
||||
) {
|
||||
(maxcount = skill_get_maxcount(skill, skill_lv)) > 0 )
|
||||
{
|
||||
int v;
|
||||
for(v=0;v<MAX_SKILLUNITGROUP && sd->ud.skillunit[v] && maxcount;v++) {
|
||||
if(sd->ud.skillunit[v]->skill_id == skill)
|
||||
@ -1754,8 +1758,7 @@ int skill_onskillusage(struct map_session_data *sd, struct block_list *bl, uint1
|
||||
sd->state.autocast = 1;
|
||||
sd->autospell3[i].lock = true;
|
||||
skill_consume_requirement(sd,skill,skill_lv,1);
|
||||
switch( type )
|
||||
{
|
||||
switch( type ) {
|
||||
case CAST_GROUND: skill_castend_pos2(&sd->bl, tbl->x, tbl->y, skill, skill_lv, tick, 0); break;
|
||||
case CAST_NODAMAGE: skill_castend_nodamage_id(&sd->bl, tbl, skill, skill_lv, tick, 0); break;
|
||||
case CAST_DAMAGE: skill_castend_damage_id(&sd->bl, tbl, skill, skill_lv, tick, 0); break;
|
||||
|
Loading…
x
Reference in New Issue
Block a user