|
@@ -3780,6 +3780,10 @@ void pc_bonus(struct map_session_data *sd,int type,int val)
|
|
|
if (sd->state.lr_flag != 2)
|
|
|
sd->special_state.no_walk_delay = 1;
|
|
|
break;
|
|
|
+ case SP_ADD_ITEM_SPHEAL_RATE:
|
|
|
+ if(sd->state.lr_flag != 2)
|
|
|
+ sd->bonus.itemsphealrate2 += val;
|
|
|
+ break;
|
|
|
default:
|
|
|
if (current_equip_combo_pos > 0) {
|
|
|
ShowWarning("pc_bonus: unknown bonus type %d %d in a combo with item #%u\n", type, val, sd->inventory_data[pc_checkequip( sd, current_equip_combo_pos )]->nameid);
|
|
@@ -4112,7 +4116,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
|
case SP_ADD_ITEM_HEAL_RATE: // bonus2 bAddItemHealRate,iid,n;
|
|
|
if(sd->state.lr_flag == 2)
|
|
|
break;
|
|
|
- if (!itemdb_exists(type2)) {
|
|
|
+ if( !item_db.exists( type2 ) ){
|
|
|
ShowWarning("pc_bonus2: SP_ADD_ITEM_HEAL_RATE Invalid item with id %d\n", type2);
|
|
|
break;
|
|
|
}
|
|
@@ -4130,7 +4134,7 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
|
ShowWarning("pc_bonus2: SP_ADD_ITEMGROUP_HEAL_RATE: Invalid item group with id %d\n", type2);
|
|
|
break;
|
|
|
}
|
|
|
- if (sd->itemhealrate.size() == MAX_PC_BONUS) {
|
|
|
+ if (sd->itemgrouphealrate.size() == MAX_PC_BONUS) {
|
|
|
ShowWarning("pc_bonus2: SP_ADD_ITEMGROUP_HEAL_RATE: Reached max (%d) number of item heal bonuses per character!\n", MAX_PC_BONUS);
|
|
|
break;
|
|
|
}
|
|
@@ -4373,6 +4377,40 @@ void pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
|
|
|
PC_BONUS_CHK_ELEMENT(type2, SP_MAGIC_SUBDEF_ELE);
|
|
|
sd->indexed_bonus.magic_subdefele[type2] += val;
|
|
|
break;
|
|
|
+ case SP_ADD_ITEM_SPHEAL_RATE: // bonus2 bAddItemSPHealRate,iid,n;
|
|
|
+ if( sd->state.lr_flag == 2 ){
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if( !item_db.exists( type2 ) ){
|
|
|
+ ShowWarning( "pc_bonus2: SP_ADD_ITEM_SPHEAL_RATE Invalid item with id %d\n", type2 );
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if( sd->itemsphealrate.size() == MAX_PC_BONUS ){
|
|
|
+ ShowWarning( "pc_bonus2: SP_ADD_ITEM_SPHEAL_RATE: Reached max (%d) number of item SP heal bonuses per character!\n", MAX_PC_BONUS );
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ pc_bonus_itembonus( sd->itemsphealrate, type2, val, false );
|
|
|
+ break;
|
|
|
+ case SP_ADD_ITEMGROUP_SPHEAL_RATE: // bonus2 bAddItemGroupSPHealRate,ig,n;
|
|
|
+ if( sd->state.lr_flag == 2 ){
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if( !type2 || !itemdb_group.exists( type2 ) ){
|
|
|
+ ShowWarning( "pc_bonus2: SP_ADD_ITEMGROUP_SPHEAL_RATE: Invalid item group with id %d\n", type2 );
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ if( sd->itemgroupsphealrate.size() == MAX_PC_BONUS ){
|
|
|
+ ShowWarning( "pc_bonus2: SP_ADD_ITEMGROUP_SPHEAL_RATE: Reached max (%d) number of item SP heal bonuses per character!\n", MAX_PC_BONUS );
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ pc_bonus_itembonus( sd->itemgroupsphealrate, type2, val, false );
|
|
|
+ break;
|
|
|
default:
|
|
|
if (current_equip_combo_pos > 0) {
|
|
|
ShowWarning("pc_bonus2: unknown bonus type %d %d %d in a combo with item #%u\n", type, type2, val, sd->inventory_data[pc_checkequip( sd, current_equip_combo_pos )]->nameid);
|
|
@@ -8947,6 +8985,7 @@ int64 pc_readparam(struct map_session_data* sd,int64 type)
|
|
|
val = sd->castrate; break;
|
|
|
#endif
|
|
|
case SP_CRIT_DEF_RATE: val = sd->bonus.crit_def_rate; break;
|
|
|
+ case SP_ADD_ITEM_SPHEAL_RATE: val = sd->bonus.itemsphealrate2; break;
|
|
|
default:
|
|
|
ShowError("pc_readparam: Attempt to read unknown parameter '%lld'.\n", type);
|
|
|
return -1;
|
|
@@ -9219,7 +9258,7 @@ int pc_itemheal(struct map_session_data *sd, t_itemid itemid, int hp, int sp)
|
|
|
//All item bonuses.
|
|
|
bonus += sd->bonus.itemhealrate2;
|
|
|
//Item Group bonuses
|
|
|
- bonus += bonus * pc_get_itemgroup_bonus(sd, itemid) / 100;
|
|
|
+ bonus += bonus * pc_get_itemgroup_bonus(sd, itemid, sd->itemgrouphealrate) / 100;
|
|
|
//Individual item bonuses.
|
|
|
for(const auto &it : sd->itemhealrate) {
|
|
|
if (it.id == itemid) {
|
|
@@ -9248,6 +9287,18 @@ int pc_itemheal(struct map_session_data *sd, t_itemid itemid, int hp, int sp)
|
|
|
if (potion_flag == 2)
|
|
|
bonus += bonus * 50 / 100;
|
|
|
|
|
|
+ // All item bonuses.
|
|
|
+ bonus += sd->bonus.itemsphealrate2;
|
|
|
+ // Item Group bonuses
|
|
|
+ bonus += bonus * pc_get_itemgroup_bonus( sd, itemid, sd->itemgroupsphealrate ) / 100;
|
|
|
+ // Individual item bonuses.
|
|
|
+ for( const auto &it : sd->itemsphealrate ){
|
|
|
+ if( it.id == itemid ){
|
|
|
+ bonus += bonus * it.val / 100;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
tmp = sp * bonus / 100; // Overflow check
|
|
|
if (bonus != 100 && tmp > sp)
|
|
|
sp = tmp;
|
|
@@ -13246,13 +13297,13 @@ short pc_maxaspd(struct map_session_data *sd) {
|
|
|
* @param nameid Item ID
|
|
|
* @return Heal rate
|
|
|
**/
|
|
|
-short pc_get_itemgroup_bonus(struct map_session_data* sd, t_itemid nameid) {
|
|
|
- if (sd->itemgrouphealrate.empty())
|
|
|
+short pc_get_itemgroup_bonus(struct map_session_data* sd, t_itemid nameid, std::vector<s_item_bonus>& bonuses) {
|
|
|
+ if (bonuses.empty())
|
|
|
return 0;
|
|
|
|
|
|
short bonus = 0;
|
|
|
|
|
|
- for (const auto &it : sd->itemgrouphealrate) {
|
|
|
+ for (const auto &it : bonuses) {
|
|
|
uint16 group_id = it.id;
|
|
|
if (group_id == 0)
|
|
|
continue;
|
|
@@ -13269,14 +13320,15 @@ short pc_get_itemgroup_bonus(struct map_session_data* sd, t_itemid nameid) {
|
|
|
* @param group_id Item Group ID
|
|
|
* @return Heal rate
|
|
|
**/
|
|
|
-short pc_get_itemgroup_bonus_group(struct map_session_data* sd, uint16 group_id) {
|
|
|
- if (sd->itemgrouphealrate.empty())
|
|
|
+short pc_get_itemgroup_bonus_group(struct map_session_data* sd, uint16 group_id, std::vector<s_item_bonus>& bonuses) {
|
|
|
+ if (bonuses.empty())
|
|
|
return 0;
|
|
|
|
|
|
- for (const auto &it : sd->itemgrouphealrate) {
|
|
|
+ for (const auto &it : bonuses) {
|
|
|
if (it.id == group_id)
|
|
|
return it.val;
|
|
|
}
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|