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:
parent
029d8dff9b
commit
e8da0c0d44
@ -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:
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user