* 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_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; struct block_list *tbl;
if( sd == NULL || !skill_id ) if( sd == NULL || !skill_id )
return 0; return 0;
for( i = 0; i < ARRAYLENGTH(sd->autospell3) && sd->autospell3[i].flag; i++ ) { for( i = 0; i < ARRAYLENGTH(sd->autospell3) && sd->autospell3[i].flag; i++ ) {
int skill, skill_lv, type;
if( sd->autospell3[i].flag != skill_id ) if( sd->autospell3[i].flag != skill_id )
continue; continue;
if( sd->autospell3[i].lock ) if( sd->autospell3[i].lock )
continue; // autospell already being executed 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; if( skill_isNotOk((skill > 0) ? skill : skill*-1, sd) )
sd->state.autocast = 0;
if ( skill_isNotOk(skill, sd) )
continue; continue;
skill_lv = sd->autospell3[i].lv ? sd->autospell3[i].lv : 1; sd->state.autocast = 0;
if( skill_lv < 0 ) skill_lv = 1 + rnd()%(-skill_lv);
if( sd->autospell3[i].id >= 0 && bl == NULL ) if( skill >= 0 && bl == NULL )
continue; // No target continue; // No target
if( rnd()%1000 >= sd->autospell3[i].rate ) if( rnd()%1000 >= sd->autospell3[i].rate )
continue; 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 ) { if( (type = skill_get_casttype(skill)) == CAST_GROUND ) {
int maxcount = 0; int maxcount = 0;
if( !(BL_PC&battle_config.skill_reiteration) && if( !(BL_PC&battle_config.skill_reiteration) &&
skill_get_unit_flag(skill)&UF_NOREITERATION && 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; continue;
if( BL_PC&battle_config.skill_nofootset && if( BL_PC&battle_config.skill_nofootset &&
skill_get_unit_flag(skill)&UF_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; continue;
if( BL_PC&battle_config.land_skill_limit && 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; int v;
for(v=0;v<MAX_SKILLUNITGROUP && sd->ud.skillunit[v] && maxcount;v++) { for(v=0;v<MAX_SKILLUNITGROUP && sd->ud.skillunit[v] && maxcount;v++) {
if(sd->ud.skillunit[v]->skill_id == skill) 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->state.autocast = 1;
sd->autospell3[i].lock = true; sd->autospell3[i].lock = true;
skill_consume_requirement(sd,skill,skill_lv,1); 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_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_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; case CAST_DAMAGE: skill_castend_damage_id(&sd->bl, tbl, skill, skill_lv, tick, 0); break;