|
@@ -2303,13 +2303,17 @@ unsigned short status_base_atk(const struct block_list *bl, const struct status_
|
|
|
* @param status: Player status
|
|
|
* @return weapon attack
|
|
|
*/
|
|
|
-unsigned int status_weapon_atk(struct weapon_atk wa, struct status_data *status)
|
|
|
+unsigned int status_weapon_atk(struct weapon_atk wa, struct map_session_data *sd)
|
|
|
{
|
|
|
- float str = status->str;
|
|
|
+ float str = sd->base_status.str;
|
|
|
+ int weapon_atk_bonus = 0;
|
|
|
+
|
|
|
if (wa.range > 3)
|
|
|
- str = status->dex;
|
|
|
- // wa.at2 = refinement, wa.atk = base equip atk, wa.atk*str/200 = bonus str
|
|
|
- return wa.atk + wa.atk2 + (int)(wa.atk * (str/200));
|
|
|
+ str = sd->base_status.dex;
|
|
|
+ if (sd->bonus.weapon_atk_rate)
|
|
|
+ weapon_atk_bonus = wa.atk * sd->bonus.weapon_atk_rate / 100;
|
|
|
+ // wa.atk2 = refinement, wa.atk = base equip atk, wa.atk*str/200 = bonus str
|
|
|
+ return wa.atk + wa.atk2 + (int)(wa.atk * (str/200) + weapon_atk_bonus);
|
|
|
}
|
|
|
#endif
|
|
|
|
|
@@ -3097,7 +3101,7 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt)
|
|
|
+ sizeof(sd->weapon_coma_race)
|
|
|
+ sizeof(sd->weapon_coma_class)
|
|
|
+ sizeof(sd->weapon_atk)
|
|
|
- + sizeof(sd->weapon_atk_rate)
|
|
|
+ + sizeof(sd->weapon_damage_rate)
|
|
|
+ sizeof(sd->arrow_addele)
|
|
|
+ sizeof(sd->arrow_addrace)
|
|
|
+ sizeof(sd->arrow_addclass)
|
|
@@ -3246,6 +3250,8 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt)
|
|
|
wa->atk2 = refine_info[wlv].bonus[r-1] / 100;
|
|
|
#ifdef RENEWAL
|
|
|
wa->matk += sd->inventory_data[index]->matk;
|
|
|
+ if (sd->bonus.weapon_matk_rate)
|
|
|
+ wa->matk += sd->inventory_data[index]->matk * sd->bonus.weapon_matk_rate / 100;
|
|
|
wa->wlv = wlv;
|
|
|
if(r && sd->weapontype1 != W_BOW) // Renewal magic attack refine bonus
|
|
|
wa->matk += refine_info[wlv].bonus[r-1] / 100;
|
|
@@ -3496,8 +3502,8 @@ int status_calc_pc_(struct map_session_data* sd, enum e_status_calc_opt opt)
|
|
|
if((skill=pc_checkskill(sd,BS_HILTBINDING))>0)
|
|
|
base_status->batk += 4;
|
|
|
#else
|
|
|
- base_status->watk = status_weapon_atk(base_status->rhw, base_status);
|
|
|
- base_status->watk2 = status_weapon_atk(base_status->lhw, base_status);
|
|
|
+ base_status->watk = status_weapon_atk(base_status->rhw, sd);
|
|
|
+ base_status->watk2 = status_weapon_atk(base_status->lhw, sd);
|
|
|
base_status->eatk = max(sd->bonus.eatk,0);
|
|
|
#endif
|
|
|
|
|
@@ -4468,6 +4474,8 @@ void status_calc_bl_main(struct block_list *bl, /*enum scb_flag*/int flag)
|
|
|
if (!sd) // Should not affect weapon refine bonus
|
|
|
status->rhw.atk2 = status_calc_watk(bl, sc, b_status->rhw.atk2);
|
|
|
|
|
|
+ if (sd && sd->bonus.weapon_atk_rate)
|
|
|
+ status->rhw.atk += status->rhw.atk * sd->bonus.weapon_atk_rate / 100;
|
|
|
if(b_status->lhw.atk) {
|
|
|
if (sd) {
|
|
|
sd->state.lr_flag = 1;
|