|
@@ -2765,23 +2765,29 @@ static void pc_bonus_subele(struct map_session_data* sd, unsigned char ele, shor
|
|
* @param bonus: Bonus array
|
|
* @param bonus: Bonus array
|
|
* @param id: Key
|
|
* @param id: Key
|
|
* @param val: Value
|
|
* @param val: Value
|
|
|
|
+ * @param cap_rate: If Value is a rate value that needs to be capped
|
|
*/
|
|
*/
|
|
-static void pc_bonus_itembonus(std::vector<s_item_bonus> &bonus, uint16 id, int val)
|
|
|
|
|
|
+static void pc_bonus_itembonus(std::vector<s_item_bonus> &bonus, uint16 id, int val, bool cap_rate)
|
|
{
|
|
{
|
|
for (auto &it : bonus) {
|
|
for (auto &it : bonus) {
|
|
if (it.id == id) {
|
|
if (it.id == id) {
|
|
- it.val = cap_value(it.val + val, -10000, 10000);
|
|
|
|
|
|
+ if (cap_rate)
|
|
|
|
+ it.val = cap_value(it.val + val, -10000, 10000);
|
|
|
|
+ else
|
|
|
|
+ it.val += val;
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
struct s_item_bonus entry = {};
|
|
struct s_item_bonus entry = {};
|
|
|
|
|
|
- if (val < -10000 || val > 10000)
|
|
|
|
|
|
+ if (cap_rate && (val < -10000 || val > 10000)) {
|
|
ShowWarning("pc_bonus_itembonus: Item bonus val %d exceeds -10000~10000 range, capping.\n", val);
|
|
ShowWarning("pc_bonus_itembonus: Item bonus val %d exceeds -10000~10000 range, capping.\n", val);
|
|
|
|
+ val = cap_value(val, -10000, 10000);
|
|
|
|
+ }
|
|
|
|
|
|
entry.id = id;
|
|
entry.id = id;
|
|
- entry.val = cap_value(val, -10000, 10000);
|
|
|
|
|
|
+ entry.val = val;
|
|
|
|
|
|
bonus.push_back(entry);
|
|
bonus.push_back(entry);
|
|
}
|
|
}
|
|
@@ -3556,7 +3562,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- pc_bonus_itembonus(sd->reseff, type2, val);
|
|
|
|
|
|
+ pc_bonus_itembonus(sd->reseff, type2, val, true);
|
|
break;
|
|
break;
|
|
case SP_MAGIC_ADDELE: // bonus2 bMagicAddEle,e,x;
|
|
case SP_MAGIC_ADDELE: // bonus2 bMagicAddEle,e,x;
|
|
PC_BONUS_CHK_ELEMENT(type2,SP_MAGIC_ADDELE);
|
|
PC_BONUS_CHK_ELEMENT(type2,SP_MAGIC_ADDELE);
|
|
@@ -3591,7 +3597,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- pc_bonus_itembonus(wd->add_dmg, type2, val);
|
|
|
|
|
|
+ pc_bonus_itembonus(wd->add_dmg, type2, val, false);
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
case SP_ADD_MAGIC_DAMAGE_CLASS: // bonus2 bAddMagicDamageClass,mid,x;
|
|
case SP_ADD_MAGIC_DAMAGE_CLASS: // bonus2 bAddMagicDamageClass,mid,x;
|
|
@@ -3602,7 +3608,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- pc_bonus_itembonus(sd->add_mdmg, type2, val);
|
|
|
|
|
|
+ pc_bonus_itembonus(sd->add_mdmg, type2, val, false);
|
|
break;
|
|
break;
|
|
case SP_ADD_DEF_MONSTER: // bonus2 bAddDefMonster,mid,x;
|
|
case SP_ADD_DEF_MONSTER: // bonus2 bAddDefMonster,mid,x;
|
|
if(sd->state.lr_flag == 2)
|
|
if(sd->state.lr_flag == 2)
|
|
@@ -3612,7 +3618,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- pc_bonus_itembonus(sd->add_def, type2, val);
|
|
|
|
|
|
+ pc_bonus_itembonus(sd->add_def, type2, val, false);
|
|
break;
|
|
break;
|
|
case SP_ADD_MDEF_MONSTER: // bonus2 bAddMDefMonster,mid,x;
|
|
case SP_ADD_MDEF_MONSTER: // bonus2 bAddMDefMonster,mid,x;
|
|
if(sd->state.lr_flag == 2)
|
|
if(sd->state.lr_flag == 2)
|
|
@@ -3622,7 +3628,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- pc_bonus_itembonus(sd->add_mdef, type2, val);
|
|
|
|
|
|
+ pc_bonus_itembonus(sd->add_mdef, type2, val, false);
|
|
break;
|
|
break;
|
|
case SP_HP_DRAIN_RATE: // bonus2 bHPDrainRate,x,n;
|
|
case SP_HP_DRAIN_RATE: // bonus2 bHPDrainRate,x,n;
|
|
if(!sd->state.lr_flag) {
|
|
if(!sd->state.lr_flag) {
|
|
@@ -3713,7 +3719,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- pc_bonus_itembonus(sd->skillatk, type2, val);
|
|
|
|
|
|
+ pc_bonus_itembonus(sd->skillatk, type2, val, false);
|
|
break;
|
|
break;
|
|
case SP_SKILL_HEAL: // bonus2 bSkillHeal,sk,n;
|
|
case SP_SKILL_HEAL: // bonus2 bSkillHeal,sk,n;
|
|
if(sd->state.lr_flag == 2)
|
|
if(sd->state.lr_flag == 2)
|
|
@@ -3723,7 +3729,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- pc_bonus_itembonus(sd->skillheal, type2, val);
|
|
|
|
|
|
+ pc_bonus_itembonus(sd->skillheal, type2, val, false);
|
|
break;
|
|
break;
|
|
case SP_SKILL_HEAL2: // bonus2 bSkillHeal2,sk,n;
|
|
case SP_SKILL_HEAL2: // bonus2 bSkillHeal2,sk,n;
|
|
if(sd->state.lr_flag == 2)
|
|
if(sd->state.lr_flag == 2)
|
|
@@ -3733,7 +3739,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- pc_bonus_itembonus(sd->skillheal2, type2, val);
|
|
|
|
|
|
+ pc_bonus_itembonus(sd->skillheal2, type2, val, false);
|
|
break;
|
|
break;
|
|
case SP_ADD_SKILL_BLOW: // bonus2 bAddSkillBlow,sk,n;
|
|
case SP_ADD_SKILL_BLOW: // bonus2 bAddSkillBlow,sk,n;
|
|
if(sd->state.lr_flag == 2)
|
|
if(sd->state.lr_flag == 2)
|
|
@@ -3743,7 +3749,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- pc_bonus_itembonus(sd->skillblown, type2, val);
|
|
|
|
|
|
+ pc_bonus_itembonus(sd->skillblown, type2, val, false);
|
|
break;
|
|
break;
|
|
case SP_HP_LOSS_RATE: // bonus2 bHPLossRate,n,t;
|
|
case SP_HP_LOSS_RATE: // bonus2 bHPLossRate,n,t;
|
|
if(sd->state.lr_flag != 2) {
|
|
if(sd->state.lr_flag != 2) {
|
|
@@ -3798,7 +3804,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- pc_bonus_itembonus(sd->itemhealrate, type2, val);
|
|
|
|
|
|
+ pc_bonus_itembonus(sd->itemhealrate, type2, val, false);
|
|
break;
|
|
break;
|
|
case SP_ADD_ITEMGROUP_HEAL_RATE: // bonus2 bAddItemGroupHealRate,ig,n;
|
|
case SP_ADD_ITEMGROUP_HEAL_RATE: // bonus2 bAddItemGroupHealRate,ig,n;
|
|
if (sd->state.lr_flag == 2)
|
|
if (sd->state.lr_flag == 2)
|
|
@@ -3812,7 +3818,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- pc_bonus_itembonus(sd->itemgrouphealrate, type2, val);
|
|
|
|
|
|
+ pc_bonus_itembonus(sd->itemgrouphealrate, type2, val, false);
|
|
break;
|
|
break;
|
|
case SP_EXP_ADDRACE: // bonus2 bExpAddRace,r,x;
|
|
case SP_EXP_ADDRACE: // bonus2 bExpAddRace,r,x;
|
|
PC_BONUS_CHK_RACE(type2,SP_EXP_ADDRACE);
|
|
PC_BONUS_CHK_RACE(type2,SP_EXP_ADDRACE);
|
|
@@ -3913,7 +3919,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- pc_bonus_itembonus(sd->skillusesprate, type2, val);
|
|
|
|
|
|
+ pc_bonus_itembonus(sd->skillusesprate, type2, val, true);
|
|
break;
|
|
break;
|
|
case SP_SKILL_DELAY:
|
|
case SP_SKILL_DELAY:
|
|
if(sd->state.lr_flag == 2)
|
|
if(sd->state.lr_flag == 2)
|
|
@@ -3923,7 +3929,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- pc_bonus_itembonus(sd->skilldelay, type2, val);
|
|
|
|
|
|
+ pc_bonus_itembonus(sd->skilldelay, type2, val, false);
|
|
break;
|
|
break;
|
|
case SP_SKILL_COOLDOWN: // bonus2 bSkillCooldown,sk,t;
|
|
case SP_SKILL_COOLDOWN: // bonus2 bSkillCooldown,sk,t;
|
|
if(sd->state.lr_flag == 2)
|
|
if(sd->state.lr_flag == 2)
|
|
@@ -3933,7 +3939,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- pc_bonus_itembonus(sd->skillcooldown, type2, val);
|
|
|
|
|
|
+ pc_bonus_itembonus(sd->skillcooldown, type2, val, false);
|
|
break;
|
|
break;
|
|
#ifdef RENEWAL_CAST
|
|
#ifdef RENEWAL_CAST
|
|
case SP_SKILL_FIXEDCAST: // bonus2 bSkillFixedCast,sk,t;
|
|
case SP_SKILL_FIXEDCAST: // bonus2 bSkillFixedCast,sk,t;
|
|
@@ -3944,7 +3950,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- pc_bonus_itembonus(sd->skillfixcast, type2, val);
|
|
|
|
|
|
+ pc_bonus_itembonus(sd->skillfixcast, type2, val, false);
|
|
break;
|
|
break;
|
|
case SP_SKILL_VARIABLECAST: // bonus2 bSkillVariableCast,sk,t;
|
|
case SP_SKILL_VARIABLECAST: // bonus2 bSkillVariableCast,sk,t;
|
|
if(sd->state.lr_flag == 2)
|
|
if(sd->state.lr_flag == 2)
|
|
@@ -3954,7 +3960,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- pc_bonus_itembonus(sd->skillvarcast, type2, val);
|
|
|
|
|
|
+ pc_bonus_itembonus(sd->skillvarcast, type2, val, false);
|
|
break;
|
|
break;
|
|
case SP_CASTRATE: // bonus2 bCastrate,sk,n;
|
|
case SP_CASTRATE: // bonus2 bCastrate,sk,n;
|
|
case SP_VARCASTRATE: // bonus2 bVariableCastrate,sk,n;
|
|
case SP_VARCASTRATE: // bonus2 bVariableCastrate,sk,n;
|
|
@@ -3965,7 +3971,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- pc_bonus_itembonus(sd->skillcastrate, type2, -val); // Send inversed value here
|
|
|
|
|
|
+ pc_bonus_itembonus(sd->skillcastrate, type2, -val, true); // Send inversed value here
|
|
break;
|
|
break;
|
|
case SP_FIXCASTRATE: // bonus2 bFixedCastrate,sk,n;
|
|
case SP_FIXCASTRATE: // bonus2 bFixedCastrate,sk,n;
|
|
if(sd->state.lr_flag == 2)
|
|
if(sd->state.lr_flag == 2)
|
|
@@ -3975,7 +3981,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- pc_bonus_itembonus(sd->skillfixcastrate, type2, -val); // Send inversed value here
|
|
|
|
|
|
+ pc_bonus_itembonus(sd->skillfixcastrate, type2, -val, true); // Send inversed value here
|
|
break;
|
|
break;
|
|
#else
|
|
#else
|
|
case SP_SKILL_FIXEDCAST: // bonus2 bSkillFixedCast,sk,t;
|
|
case SP_SKILL_FIXEDCAST: // bonus2 bSkillFixedCast,sk,t;
|
|
@@ -3992,7 +3998,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- pc_bonus_itembonus(sd->skillcastrate, type2, val);
|
|
|
|
|
|
+ pc_bonus_itembonus(sd->skillcastrate, type2, val, true);
|
|
break;
|
|
break;
|
|
#endif
|
|
#endif
|
|
case SP_SKILL_USE_SP: // bonus2 bSkillUseSP,sk,n;
|
|
case SP_SKILL_USE_SP: // bonus2 bSkillUseSP,sk,n;
|
|
@@ -4003,7 +4009,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- pc_bonus_itembonus(sd->skillusesp, type2, val);
|
|
|
|
|
|
+ pc_bonus_itembonus(sd->skillusesp, type2, val, false);
|
|
break;
|
|
break;
|
|
case SP_SUB_SKILL: // bonus2 bSubSkill,sk,n;
|
|
case SP_SUB_SKILL: // bonus2 bSubSkill,sk,n;
|
|
if (sd->subskill.size() == MAX_PC_BONUS) {
|
|
if (sd->subskill.size() == MAX_PC_BONUS) {
|
|
@@ -4011,7 +4017,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- pc_bonus_itembonus(sd->subskill, type2, val);
|
|
|
|
|
|
+ pc_bonus_itembonus(sd->subskill, type2, val, false);
|
|
break;
|
|
break;
|
|
case SP_SUBDEF_ELE: // bonus2 bSubDefEle,e,x;
|
|
case SP_SUBDEF_ELE: // bonus2 bSubDefEle,e,x;
|
|
PC_BONUS_CHK_ELEMENT(type2,SP_SUBDEF_ELE);
|
|
PC_BONUS_CHK_ELEMENT(type2,SP_SUBDEF_ELE);
|