From 511c337ee363a4d40cadebae6205272f55e57410 Mon Sep 17 00:00:00 2001 From: eppc0330 <47050704+eppc0330@users.noreply.github.com> Date: Mon, 10 Jul 2023 08:26:29 +0900 Subject: [PATCH] Fix multi-hit skills priority (#7829) --- src/map/battle.cpp | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/map/battle.cpp b/src/map/battle.cpp index 1610a9c577..6de794c2cb 100644 --- a/src/map/battle.cpp +++ b/src/map/battle.cpp @@ -4027,7 +4027,23 @@ static void battle_calc_multi_attack(struct Damage* wd, struct block_list *src,s if( sd && !skill_id ) { // if no skill_id passed, check for double attack [helvetica] short i; - if( ( ( skill_lv = pc_checkskill(sd,TF_DOUBLE) ) > 0 && sd->weapontype1 == W_DAGGER ) + if(sc && sc->getSCE(SC_FEARBREEZE) && sd->weapontype1==W_BOW + && (i = sd->equip_index[EQI_AMMO]) >= 0 && sd->inventory_data[i] && sd->inventory.u.items_inventory[i].amount > 1) + { + int chance = rnd()%100; + switch(sc->getSCE(SC_FEARBREEZE)->val1) { + case 5: if( chance < 4) { wd->div_ = 5; break; } // 3 % chance to attack 5 times. + case 4: if( chance < 7) { wd->div_ = 4; break; } // 6 % chance to attack 4 times. + case 3: if( chance < 10) { wd->div_ = 3; break; } // 9 % chance to attack 3 times. + case 2: + case 1: if( chance < 13) { wd->div_ = 2; break; } // 12 % chance to attack 2 times. + } + wd->div_ = min(wd->div_,sd->inventory.u.items_inventory[i].amount); + sc->getSCE(SC_FEARBREEZE)->val4 = wd->div_-1; + if (wd->div_ > 1) + wd->type = DMG_MULTI_HIT; + } + if( wd->div_ == 1 && ( ( skill_lv = pc_checkskill(sd,TF_DOUBLE) ) > 0 && sd->weapontype1 == W_DAGGER ) || ( pc_checkskill_flag(*sd, TF_DOUBLE) > SKILL_FLAG_PERMANENT && sd->weapontype1 != W_FIST ) || ( sd->bonus.double_rate > 0 && sd->weapontype1 != W_FIST ) // Will fail bare-handed || ( sc && sc->getSCE(SC_KAGEMUSYA) && sd->weapontype1 != W_FIST )) // Will fail bare-handed @@ -4048,7 +4064,7 @@ static void battle_calc_multi_attack(struct Damage* wd, struct block_list *src,s wd->type = DMG_MULTI_HIT; } } - else if( ((sd->weapontype1 == W_REVOLVER && (skill_lv = pc_checkskill(sd,GS_CHAINACTION)) > 0) //Normal Chain Action effect + if( wd->div_ == 1 && ((sd->weapontype1 == W_REVOLVER && (skill_lv = pc_checkskill(sd,GS_CHAINACTION)) > 0) //Normal Chain Action effect || (sc && sc->count && sc->getSCE(SC_E_CHAIN) && (skill_lv = sc->getSCE(SC_E_CHAIN)->val1) > 0)) //Chain Action of ETERNAL_CHAIN && rnd()%100 < 5*skill_lv ) //Success rate { @@ -4057,22 +4073,6 @@ static void battle_calc_multi_attack(struct Damage* wd, struct block_list *src,s sc_start(src,src,SC_QD_SHOT_READY,100,target->id,skill_get_time(RL_QD_SHOT,1)); } - else if(sc && sc->getSCE(SC_FEARBREEZE) && sd->weapontype1==W_BOW - && (i = sd->equip_index[EQI_AMMO]) >= 0 && sd->inventory_data[i] && sd->inventory.u.items_inventory[i].amount > 1) - { - int chance = rnd()%100; - switch(sc->getSCE(SC_FEARBREEZE)->val1) { - case 5: if( chance < 4) { wd->div_ = 5; break; } // 3 % chance to attack 5 times. - case 4: if( chance < 7) { wd->div_ = 4; break; } // 6 % chance to attack 4 times. - case 3: if( chance < 10) { wd->div_ = 3; break; } // 9 % chance to attack 3 times. - case 2: - case 1: if( chance < 13) { wd->div_ = 2; break; } // 12 % chance to attack 2 times. - } - wd->div_ = min(wd->div_,sd->inventory.u.items_inventory[i].amount); - sc->getSCE(SC_FEARBREEZE)->val4 = wd->div_-1; - if (wd->div_ > 1) - wd->type = DMG_MULTI_HIT; - } } switch (skill_id) {