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;
|
break;
|
||||||
case SP_DELAYRATE:
|
case SP_DELAYRATE:
|
||||||
if(sd->state.lr_flag != 2)
|
if(sd->state.lr_flag != 2)
|
||||||
sd->delayrate+=val;
|
sd->bonus.delayrate -= val;
|
||||||
break;
|
break;
|
||||||
case SP_CRIT_ATK_RATE:
|
case SP_CRIT_ATK_RATE:
|
||||||
if(sd->state.lr_flag != 2)
|
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_WEAPON_RATE: val = sd->bonus.break_weapon_rate; break;
|
||||||
case SP_BREAK_ARMOR_RATE: val = sd->bonus.break_armor_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_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_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_WEAPON: val = (sd->bonus.unstripable_equip&EQP_WEAPON)?1:0; break;
|
||||||
case SP_UNSTRIPABLE:
|
case SP_UNSTRIPABLE:
|
||||||
|
@ -546,7 +546,7 @@ struct map_session_data {
|
|||||||
unsigned short unbreakable; // chance to prevent ANY equipment breaking [celest]
|
unsigned short unbreakable; // chance to prevent ANY equipment breaking [celest]
|
||||||
unsigned short unbreakable_equip; //100% break resistance on certain equipment
|
unsigned short unbreakable_equip; //100% break resistance on certain equipment
|
||||||
unsigned short unstripable_equip;
|
unsigned short unstripable_equip;
|
||||||
int fixcastrate, varcastrate; // n/100
|
int fixcastrate, varcastrate, delayrate; // n/100
|
||||||
int add_fixcast, add_varcast; // in milliseconds
|
int add_fixcast, add_varcast; // in milliseconds
|
||||||
int ematk; // matk bonus from equipment
|
int ematk; // matk bonus from equipment
|
||||||
int eatk; // atk bonus from equipment
|
int eatk; // atk bonus from equipment
|
||||||
@ -556,7 +556,7 @@ struct map_session_data {
|
|||||||
} bonus;
|
} bonus;
|
||||||
// zeroed vars end here.
|
// zeroed vars end here.
|
||||||
|
|
||||||
int castrate,delayrate,hprate,sprate,dsprate;
|
int castrate,hprate,sprate,dsprate;
|
||||||
int hprecov_rate,sprecov_rate;
|
int hprecov_rate,sprecov_rate;
|
||||||
int matk_rate;
|
int matk_rate;
|
||||||
int critical_rate,hit_rate,flee_rate,flee2_rate,def_rate,def2_rate,mdef_rate,mdef2_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;
|
return battle_config.min_skill_delay_limit;
|
||||||
|
|
||||||
int delaynodex = skill_get_delaynodex(skill_id);
|
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)
|
if (time < 0)
|
||||||
time = -time + status_get_amotion(bl); // If set to <0, add to attack motion.
|
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 (!(delaynodex&2)) {
|
||||||
if (sc && sc->count) {
|
if (sc && sc->count) {
|
||||||
if (sc->data[SC_POEMBRAGI])
|
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)
|
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)
|
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) {
|
if (!(delaynodex&4) && bl->type == BL_PC) {
|
||||||
map_session_data* sd = (map_session_data*)bl;
|
map_session_data* sd = (map_session_data*)bl;
|
||||||
|
|
||||||
if (sd->delayrate != 100) // bonus bDelayRate
|
if (sd->bonus.delayrate != 0) // bonus bDelayRate
|
||||||
time += time * sd->delayrate / 100;
|
delay += sd->bonus.delayrate;
|
||||||
|
|
||||||
for (auto &it : sd->skilldelay) { // bonus2 bSkillDelay
|
for (auto &it : sd->skilldelay) { // bonus2 bSkillDelay
|
||||||
if (it.id == skill_id) {
|
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)
|
if (battle_config.delay_rate != 100)
|
||||||
time = time * 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->hprate = 100;
|
||||||
sd->sprate = 100;
|
sd->sprate = 100;
|
||||||
sd->castrate = 100;
|
sd->castrate = 100;
|
||||||
sd->delayrate = 100;
|
|
||||||
sd->dsprate = 100;
|
sd->dsprate = 100;
|
||||||
sd->hprecov_rate = 100;
|
sd->hprecov_rate = 100;
|
||||||
sd->sprecov_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;
|
sd->dsprate = 0;
|
||||||
if(sd->castrate < 0)
|
if(sd->castrate < 0)
|
||||||
sd->castrate = 0;
|
sd->castrate = 0;
|
||||||
if(sd->delayrate < 0)
|
|
||||||
sd->delayrate = 0;
|
|
||||||
if(sd->hprecov_rate < 0)
|
if(sd->hprecov_rate < 0)
|
||||||
sd->hprecov_rate = 0;
|
sd->hprecov_rate = 0;
|
||||||
if(sd->sprecov_rate < 0)
|
if(sd->sprecov_rate < 0)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user