Added some additional SP heal bonuses (#6292)
Fixes #6076 Thanks to @idk-whoami and @Atemo
This commit is contained in:
parent
58bc89d5db
commit
d54076d2f6
@ -187,13 +187,16 @@ bonus bNoMiscDamage,n; Adds n% reduction to received misc damage
|
|||||||
|
|
||||||
Healing
|
Healing
|
||||||
-------
|
-------
|
||||||
bonus bHealPower,n; Increases heal amount of all heal skills by n%
|
bonus bHealPower,n; Increases heal amount of all heal skills by n%
|
||||||
bonus bHealPower2,n; Increases heal amount if you are healed by any skills by n%
|
bonus bHealPower2,n; Increases heal amount if you are healed by any skills by n%
|
||||||
bonus2 bSkillHeal,sk,n; Increases heal amount of skill sk by n%
|
bonus2 bSkillHeal,sk,n; Increases heal amount of skill sk by n%
|
||||||
bonus2 bSkillHeal2,sk,n; Increases heal amount if you are healed by skill sk by n%
|
bonus2 bSkillHeal2,sk,n; Increases heal amount if you are healed by skill sk by n%
|
||||||
bonus bAddItemHealRate,n; Increases HP recovered by n% for healing items
|
bonus bAddItemHealRate,n; Increases HP recovered by n% for healing items
|
||||||
bonus2 bAddItemHealRate,iid,n; Increases HP recovered by n% for item iid
|
bonus2 bAddItemHealRate,iid,n; Increases HP recovered by n% for item iid
|
||||||
bonus2 bAddItemGroupHealRate,ig,n; Increases HP recovered by n% for items of item group ig
|
bonus2 bAddItemGroupHealRate,ig,n; Increases HP recovered by n% for items of item group ig
|
||||||
|
bonus bAddItemSPHealRate,n; Increases SP recovered by n% for healing items
|
||||||
|
bonus2 bAddItemSPHealRate,iid,n; Increases SP recovered by n% for item iid
|
||||||
|
bonus2 bAddItemGroupSPHealRate,ig,n; Increases SP recovered by n% for items of item group ig
|
||||||
|
|
||||||
Cast time/delay
|
Cast time/delay
|
||||||
---------------
|
---------------
|
||||||
|
@ -515,7 +515,7 @@ enum _sp {
|
|||||||
SP_WEAPON_ATK_RATE, SP_WEAPON_MATK_RATE, SP_DROP_ADDRACE, SP_DROP_ADDCLASS, SP_NO_MADO_FUEL, // 2083-2087
|
SP_WEAPON_ATK_RATE, SP_WEAPON_MATK_RATE, SP_DROP_ADDRACE, SP_DROP_ADDCLASS, SP_NO_MADO_FUEL, // 2083-2087
|
||||||
SP_IGNORE_DEF_CLASS_RATE, SP_REGEN_PERCENT_HP, SP_REGEN_PERCENT_SP, SP_SKILL_DELAY, SP_NO_WALK_DELAY, //2088-2092
|
SP_IGNORE_DEF_CLASS_RATE, SP_REGEN_PERCENT_HP, SP_REGEN_PERCENT_SP, SP_SKILL_DELAY, SP_NO_WALK_DELAY, //2088-2092
|
||||||
SP_LONG_SP_GAIN_VALUE, SP_LONG_HP_GAIN_VALUE, SP_SHORT_ATK_RATE, SP_MAGIC_SUBSIZE, SP_CRIT_DEF_RATE, // 2093-2097
|
SP_LONG_SP_GAIN_VALUE, SP_LONG_HP_GAIN_VALUE, SP_SHORT_ATK_RATE, SP_MAGIC_SUBSIZE, SP_CRIT_DEF_RATE, // 2093-2097
|
||||||
SP_MAGIC_SUBDEF_ELE, SP_REDUCE_DAMAGE_RETURN // 2098-2099
|
SP_MAGIC_SUBDEF_ELE, SP_REDUCE_DAMAGE_RETURN, SP_ADD_ITEM_SPHEAL_RATE, SP_ADD_ITEMGROUP_SPHEAL_RATE, // 2098-2101
|
||||||
};
|
};
|
||||||
|
|
||||||
enum _look {
|
enum _look {
|
||||||
|
@ -3780,6 +3780,10 @@ void pc_bonus(struct map_session_data *sd,int type,int val)
|
|||||||
if (sd->state.lr_flag != 2)
|
if (sd->state.lr_flag != 2)
|
||||||
sd->special_state.no_walk_delay = 1;
|
sd->special_state.no_walk_delay = 1;
|
||||||
break;
|
break;
|
||||||
|
case SP_ADD_ITEM_SPHEAL_RATE:
|
||||||
|
if(sd->state.lr_flag != 2)
|
||||||
|
sd->bonus.itemsphealrate2 += val;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
if (current_equip_combo_pos > 0) {
|
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);
|
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;
|
case SP_ADD_ITEM_HEAL_RATE: // bonus2 bAddItemHealRate,iid,n;
|
||||||
if(sd->state.lr_flag == 2)
|
if(sd->state.lr_flag == 2)
|
||||||
break;
|
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);
|
ShowWarning("pc_bonus2: SP_ADD_ITEM_HEAL_RATE Invalid item with id %d\n", type2);
|
||||||
break;
|
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);
|
ShowWarning("pc_bonus2: SP_ADD_ITEMGROUP_HEAL_RATE: Invalid item group with id %d\n", type2);
|
||||||
break;
|
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);
|
ShowWarning("pc_bonus2: SP_ADD_ITEMGROUP_HEAL_RATE: Reached max (%d) number of item heal bonuses per character!\n", MAX_PC_BONUS);
|
||||||
break;
|
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);
|
PC_BONUS_CHK_ELEMENT(type2, SP_MAGIC_SUBDEF_ELE);
|
||||||
sd->indexed_bonus.magic_subdefele[type2] += val;
|
sd->indexed_bonus.magic_subdefele[type2] += val;
|
||||||
break;
|
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:
|
default:
|
||||||
if (current_equip_combo_pos > 0) {
|
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);
|
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;
|
val = sd->castrate; break;
|
||||||
#endif
|
#endif
|
||||||
case SP_CRIT_DEF_RATE: val = sd->bonus.crit_def_rate; break;
|
case SP_CRIT_DEF_RATE: val = sd->bonus.crit_def_rate; break;
|
||||||
|
case SP_ADD_ITEM_SPHEAL_RATE: val = sd->bonus.itemsphealrate2; break;
|
||||||
default:
|
default:
|
||||||
ShowError("pc_readparam: Attempt to read unknown parameter '%lld'.\n", type);
|
ShowError("pc_readparam: Attempt to read unknown parameter '%lld'.\n", type);
|
||||||
return -1;
|
return -1;
|
||||||
@ -9219,7 +9258,7 @@ int pc_itemheal(struct map_session_data *sd, t_itemid itemid, int hp, int sp)
|
|||||||
//All item bonuses.
|
//All item bonuses.
|
||||||
bonus += sd->bonus.itemhealrate2;
|
bonus += sd->bonus.itemhealrate2;
|
||||||
//Item Group bonuses
|
//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.
|
//Individual item bonuses.
|
||||||
for(const auto &it : sd->itemhealrate) {
|
for(const auto &it : sd->itemhealrate) {
|
||||||
if (it.id == itemid) {
|
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)
|
if (potion_flag == 2)
|
||||||
bonus += bonus * 50 / 100;
|
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
|
tmp = sp * bonus / 100; // Overflow check
|
||||||
if (bonus != 100 && tmp > sp)
|
if (bonus != 100 && tmp > sp)
|
||||||
sp = tmp;
|
sp = tmp;
|
||||||
@ -13246,13 +13297,13 @@ short pc_maxaspd(struct map_session_data *sd) {
|
|||||||
* @param nameid Item ID
|
* @param nameid Item ID
|
||||||
* @return Heal rate
|
* @return Heal rate
|
||||||
**/
|
**/
|
||||||
short pc_get_itemgroup_bonus(struct map_session_data* sd, t_itemid nameid) {
|
short pc_get_itemgroup_bonus(struct map_session_data* sd, t_itemid nameid, std::vector<s_item_bonus>& bonuses) {
|
||||||
if (sd->itemgrouphealrate.empty())
|
if (bonuses.empty())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
short bonus = 0;
|
short bonus = 0;
|
||||||
|
|
||||||
for (const auto &it : sd->itemgrouphealrate) {
|
for (const auto &it : bonuses) {
|
||||||
uint16 group_id = it.id;
|
uint16 group_id = it.id;
|
||||||
if (group_id == 0)
|
if (group_id == 0)
|
||||||
continue;
|
continue;
|
||||||
@ -13269,14 +13320,15 @@ short pc_get_itemgroup_bonus(struct map_session_data* sd, t_itemid nameid) {
|
|||||||
* @param group_id Item Group ID
|
* @param group_id Item Group ID
|
||||||
* @return Heal rate
|
* @return Heal rate
|
||||||
**/
|
**/
|
||||||
short pc_get_itemgroup_bonus_group(struct map_session_data* sd, uint16 group_id) {
|
short pc_get_itemgroup_bonus_group(struct map_session_data* sd, uint16 group_id, std::vector<s_item_bonus>& bonuses) {
|
||||||
if (sd->itemgrouphealrate.empty())
|
if (bonuses.empty())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (const auto &it : sd->itemgrouphealrate) {
|
for (const auto &it : bonuses) {
|
||||||
if (it.id == group_id)
|
if (it.id == group_id)
|
||||||
return it.val;
|
return it.val;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -487,7 +487,7 @@ struct map_session_data {
|
|||||||
std::vector<s_addeffect> addeff, addeff_atked;
|
std::vector<s_addeffect> addeff, addeff_atked;
|
||||||
std::vector<s_addeffectonskill> addeff_onskill;
|
std::vector<s_addeffectonskill> addeff_onskill;
|
||||||
std::vector<s_item_bonus> skillatk, skillusesprate, skillusesp, skillheal, skillheal2, skillblown, skillcastrate, skillfixcastrate, subskill, skillcooldown, skillfixcast,
|
std::vector<s_item_bonus> skillatk, skillusesprate, skillusesp, skillheal, skillheal2, skillblown, skillcastrate, skillfixcastrate, subskill, skillcooldown, skillfixcast,
|
||||||
skillvarcast, skilldelay, itemhealrate, add_def, add_mdef, add_mdmg, reseff, itemgrouphealrate;
|
skillvarcast, skilldelay, itemhealrate, add_def, add_mdef, add_mdmg, reseff, itemgrouphealrate, itemsphealrate, itemgroupsphealrate;
|
||||||
std::vector<s_add_drop> add_drop;
|
std::vector<s_add_drop> add_drop;
|
||||||
std::vector<s_addele2> subele2;
|
std::vector<s_addele2> subele2;
|
||||||
std::vector<s_vanish_bonus> sp_vanish, hp_vanish;
|
std::vector<s_vanish_bonus> sp_vanish, hp_vanish;
|
||||||
@ -536,6 +536,7 @@ struct map_session_data {
|
|||||||
int classchange; // [Valaris]
|
int classchange; // [Valaris]
|
||||||
int speed_rate, speed_add_rate, aspd_add;
|
int speed_rate, speed_add_rate, aspd_add;
|
||||||
int itemhealrate2; // [Epoque] Increase heal rate of all healing items.
|
int itemhealrate2; // [Epoque] Increase heal rate of all healing items.
|
||||||
|
int itemsphealrate2;
|
||||||
int shieldmdef;//royal guard's
|
int shieldmdef;//royal guard's
|
||||||
unsigned int setitem_hash, setitem_hash2; //Split in 2 because shift operations only work on int ranges. [Skotlex]
|
unsigned int setitem_hash, setitem_hash2; //Split in 2 because shift operations only work on int ranges. [Skotlex]
|
||||||
|
|
||||||
@ -1469,8 +1470,8 @@ void pc_bonus_script_clear(struct map_session_data *sd, uint16 flag);
|
|||||||
|
|
||||||
void pc_cell_basilica(struct map_session_data *sd);
|
void pc_cell_basilica(struct map_session_data *sd);
|
||||||
|
|
||||||
short pc_get_itemgroup_bonus(struct map_session_data* sd, t_itemid nameid);
|
short pc_get_itemgroup_bonus(struct map_session_data* sd, t_itemid nameid, std::vector<s_item_bonus>& bonuses);
|
||||||
short pc_get_itemgroup_bonus_group(struct map_session_data* sd, uint16 group_id);
|
short pc_get_itemgroup_bonus_group(struct map_session_data* sd, uint16 group_id, std::vector<s_item_bonus>& bonuses);
|
||||||
|
|
||||||
bool pc_is_same_equip_index(enum equip_index eqi, short *equip_index, short index);
|
bool pc_is_same_equip_index(enum equip_index eqi, short *equip_index, short index);
|
||||||
/// Check if player is Taekwon Ranker and the level is >= 90 (battle_config.taekwon_ranker_min_lv)
|
/// Check if player is Taekwon Ranker and the level is >= 90 (battle_config.taekwon_ranker_min_lv)
|
||||||
|
@ -765,6 +765,8 @@
|
|||||||
export_constant2("bCritDefRate",SP_CRIT_DEF_RATE);
|
export_constant2("bCritDefRate",SP_CRIT_DEF_RATE);
|
||||||
export_constant2("bMagicSubDefEle", SP_MAGIC_SUBDEF_ELE);
|
export_constant2("bMagicSubDefEle", SP_MAGIC_SUBDEF_ELE);
|
||||||
export_constant2("bReduceDamageReturn",SP_REDUCE_DAMAGE_RETURN);
|
export_constant2("bReduceDamageReturn",SP_REDUCE_DAMAGE_RETURN);
|
||||||
|
export_constant2("bAddItemSPHealRate", SP_ADD_ITEM_SPHEAL_RATE);
|
||||||
|
export_constant2("bAddItemGroupSPHealRate", SP_ADD_ITEMGROUP_SPHEAL_RATE);
|
||||||
|
|
||||||
/* equip indices */
|
/* equip indices */
|
||||||
export_constant(EQI_COMPOUND_ON);
|
export_constant(EQI_COMPOUND_ON);
|
||||||
|
@ -8240,8 +8240,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((bonus = pc_get_itemgroup_bonus_group(sd, IG_POTION))) {
|
if ((bonus = pc_get_itemgroup_bonus_group(sd, IG_POTION, sd->itemgrouphealrate))) {
|
||||||
hp += hp * bonus / 100;
|
hp += hp * bonus / 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ( bonus = pc_get_itemgroup_bonus_group( sd, IG_POTION, sd->itemgroupsphealrate ) ) ){
|
||||||
sp += sp * bonus / 100;
|
sp += sp * bonus / 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4251,6 +4251,8 @@ int status_calc_pc_sub(struct map_session_data* sd, enum e_status_calc_opt opt)
|
|||||||
sd->skilldelay.clear();
|
sd->skilldelay.clear();
|
||||||
sd->sp_vanish.clear();
|
sd->sp_vanish.clear();
|
||||||
sd->hp_vanish.clear();
|
sd->hp_vanish.clear();
|
||||||
|
sd->itemsphealrate.clear();
|
||||||
|
sd->itemgroupsphealrate.clear();
|
||||||
|
|
||||||
// Zero up structures...
|
// Zero up structures...
|
||||||
memset(&sd->hp_loss, 0, sizeof(sd->hp_loss)
|
memset(&sd->hp_loss, 0, sizeof(sd->hp_loss)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user