Fixes skill aftercast delay (#6240)

* Fixes #6232.
* Follow up to 9e4dc7d.
* Fixes the aftercast delay of skills so that status and item bonuses properly stack before calculating the final result.
* bSkillDelay should add directly to the time and not be included in the rate formula.
Thanks to @AsurielRO!
This commit is contained in:
Aleos 2021-09-27 10:00:40 -04:00 committed by GitHub
parent 029d8dff9b
commit e8da0c0d44
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 17 additions and 15 deletions

View File

@ -3634,7 +3634,7 @@ void pc_bonus(struct map_session_data *sd,int type,int val)
break;
case SP_DELAYRATE:
if(sd->state.lr_flag != 2)
sd->delayrate+=val;
sd->bonus.delayrate -= val;
break;
case SP_CRIT_ATK_RATE:
if(sd->state.lr_flag != 2)
@ -8917,7 +8917,7 @@ int64 pc_readparam(struct map_session_data* sd,int64 type)
case SP_BREAK_WEAPON_RATE: val = sd->bonus.break_weapon_rate; break;
case SP_BREAK_ARMOR_RATE: val = sd->bonus.break_armor_rate; break;
case SP_ADD_STEAL_RATE: val = sd->bonus.add_steal_rate; break;
case SP_DELAYRATE: val = sd->delayrate; break;
case SP_DELAYRATE: val = sd->bonus.delayrate; break;
case SP_CRIT_ATK_RATE: val = sd->bonus.crit_atk_rate; break;
case SP_UNSTRIPABLE_WEAPON: val = (sd->bonus.unstripable_equip&EQP_WEAPON)?1:0; break;
case SP_UNSTRIPABLE:

View File

@ -546,7 +546,7 @@ struct map_session_data {
unsigned short unbreakable; // chance to prevent ANY equipment breaking [celest]
unsigned short unbreakable_equip; //100% break resistance on certain equipment
unsigned short unstripable_equip;
int fixcastrate, varcastrate; // n/100
int fixcastrate, varcastrate, delayrate; // n/100
int add_fixcast, add_varcast; // in milliseconds
int ematk; // matk bonus from equipment
int eatk; // atk bonus from equipment
@ -556,7 +556,7 @@ struct map_session_data {
} bonus;
// zeroed vars end here.
int castrate,delayrate,hprate,sprate,dsprate;
int castrate,hprate,sprate,dsprate;
int hprecov_rate,sprecov_rate;
int matk_rate;
int critical_rate,hit_rate,flee_rate,flee2_rate,def_rate,def2_rate,mdef_rate,mdef2_rate;

View File

@ -17308,7 +17308,7 @@ int skill_delayfix(struct block_list *bl, uint16 skill_id, uint16 skill_lv)
return battle_config.min_skill_delay_limit;
int delaynodex = skill_get_delaynodex(skill_id);
int time = skill_get_delay(skill_id, skill_lv);
double time = skill_get_delay(skill_id, skill_lv);
if (time < 0)
time = -time + status_get_amotion(bl); // If set to <0, add to attack motion.
@ -17370,22 +17370,24 @@ int skill_delayfix(struct block_list *bl, uint16 skill_id, uint16 skill_lv)
}
}
int delay = 0;
if (!(delaynodex&2)) {
if (sc && sc->count) {
if (sc->data[SC_POEMBRAGI])
time -= time * sc->data[SC_POEMBRAGI]->val3 / 100;
delay += sc->data[SC_POEMBRAGI]->val3;
if (sc->data[SC_WIND_INSIGNIA] && sc->data[SC_WIND_INSIGNIA]->val1 == 3 && skill_get_type(skill_id) == BF_MAGIC && skill_get_ele(skill_id, skill_lv) == ELE_WIND)
time /= 2; // After Delay of Wind element spells reduced by 50%.
delay += 50; // After Delay of Wind element spells reduced by 50%.
if (sc->data[SC_MAGICMUSHROOM] && sc->data[SC_MAGICMUSHROOM]->val3 == 0)
time -= time * sc->data[SC_MAGICMUSHROOM]->val2 / 100;
delay += sc->data[SC_MAGICMUSHROOM]->val2;
}
}
if (!(delaynodex&4) && bl->type == BL_PC) {
map_session_data* sd = (map_session_data*)bl;
if (sd->delayrate != 100) // bonus bDelayRate
time += time * sd->delayrate / 100;
if (sd->bonus.delayrate != 0) // bonus bDelayRate
delay += sd->bonus.delayrate;
for (auto &it : sd->skilldelay) { // bonus2 bSkillDelay
if (it.id == skill_id) {
@ -17395,12 +17397,15 @@ int skill_delayfix(struct block_list *bl, uint16 skill_id, uint16 skill_lv)
}
}
if (delay != 0)
time = time * (1 - (float)min(delay, 100) / 100);
if (battle_config.delay_rate != 100)
time = time * battle_config.delay_rate / 100;
//ShowInfo("Delay delayfix = %d\n",time);
//ShowInfo("Delay delayfix = %f\n",time);
return max(time,0);
return max((int)time,0);
}

View File

@ -4169,7 +4169,6 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt)
sd->hprate = 100;
sd->sprate = 100;
sd->castrate = 100;
sd->delayrate = 100;
sd->dsprate = 100;
sd->hprecov_rate = 100;
sd->sprecov_rate = 100;
@ -4888,8 +4887,6 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt)
sd->dsprate = 0;
if(sd->castrate < 0)
sd->castrate = 0;
if(sd->delayrate < 0)
sd->delayrate = 0;
if(sd->hprecov_rate < 0)
sd->hprecov_rate = 0;
if(sd->sprecov_rate < 0)