From 04f13d84071020b3e7a19f0d6e32cdb3b69d443b Mon Sep 17 00:00:00 2001 From: Cahyadi Ramadhan Togihon Date: Sat, 5 Oct 2013 18:10:14 +0700 Subject: [PATCH] * Fixed 'bAutoSpellOnSkill' (bugreport:8124) --- src/map/skill.c | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/src/map/skill.c b/src/map/skill.c index 71bdb6e315..600bcdc036 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -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;vud.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;