* Fixed 'bAutoSpellOnSkill' (bugreport:8124)

This commit is contained in:
Cahyadi Ramadhan Togihon 2013-10-05 18:10:14 +07:00
parent 9cb9bb1576
commit 04f13d8407

View File

@ -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;