mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-13 06:21:28 +00:00
[Spells] Implemented SPA 122 SE_ReduceSkill (#4234)
* Implement SPA122 v1 * Implemented SPA 122 ReduceSkill SE_ReduceSkill SPA 122 base: skill id, limit: none, max: none, formula: % skill is reduced (positive) * Implemented SPA 122 Reduce Skill remove incorrect SPA addition * Break out multiple lines * reformatted reformatted --------- Co-authored-by: Akkadius <akkadius1@gmail.com>
This commit is contained in:
parent
758859eea6
commit
a71ad416b4
@ -916,7 +916,7 @@ typedef enum {
|
||||
#define SE_AttackSpeed3 119 // implemented
|
||||
#define SE_HealRate 120 // implemented - reduces healing by a %
|
||||
#define SE_ReverseDS 121 // implemented
|
||||
//#define SE_ReduceSkill 122 // not implemented TODO: Now used on live, decreases skills by percent
|
||||
#define SE_ReduceSkill 122 // implemented - base: skill id, limit: none, max: none, formula: % skill is reduced (positive)
|
||||
#define SE_Screech 123 // implemented Spell Blocker(If have buff with value +1 will block any effect with -1)
|
||||
#define SE_ImprovedDamage 124 // implemented
|
||||
#define SE_ImprovedHeal 125 // implemented
|
||||
|
||||
@ -2789,6 +2789,25 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne
|
||||
break;
|
||||
}
|
||||
|
||||
case SE_ReduceSkill: {
|
||||
// Bad data or unsupported new skill
|
||||
if (spells[spell_id].base_value[i] > EQ::skills::HIGHEST_SKILL) {
|
||||
break;
|
||||
}
|
||||
//cap skill reducation at 100%
|
||||
uint32 skill_reducation_percent = spells[spell_id].formula[i];
|
||||
if (spells[spell_id].formula[i] > 100) {
|
||||
skill_reducation_percent = 100;
|
||||
}
|
||||
|
||||
if (spells[spell_id].base_value[i] <= EQ::skills::HIGHEST_SKILL) {
|
||||
if (new_bonus->ReduceSkill[spells[spell_id].base_value[i]] < skill_reducation_percent) {
|
||||
new_bonus->ReduceSkill[spells[spell_id].base_value[i]] = skill_reducation_percent;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case SE_StunResist:
|
||||
{
|
||||
if(new_bonus->StunResist < effect_value)
|
||||
|
||||
@ -12414,3 +12414,34 @@ std::vector<Mob*> Client::GetRaidOrGroupOrSelf(bool clients_only)
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
uint16 Client::GetSkill(EQ::skills::SkillType skill_id) const
|
||||
{
|
||||
if (skill_id <= EQ::skills::HIGHEST_SKILL) {
|
||||
|
||||
if (spellbonuses.ReduceSkill[skill_id] > 0) {
|
||||
|
||||
if (itembonuses.skillmod[skill_id] > 0) {
|
||||
|
||||
if (itembonuses.skillmodmax[skill_id] > 0) {
|
||||
return std::min(m_pp.skills[skill_id] + itembonuses.skillmodmax[skill_id], m_pp.skills[skill_id] + ((m_pp.skills[skill_id] * (itembonuses.skillmod[skill_id] - spellbonuses.ReduceSkill[skill_id])) / 100));
|
||||
}
|
||||
return m_pp.skills[skill_id] + ((m_pp.skills[skill_id] * (itembonuses.skillmod[skill_id] - spellbonuses.ReduceSkill[skill_id])) / 100);
|
||||
}
|
||||
return m_pp.skills[skill_id] - ((m_pp.skills[skill_id] * spellbonuses.ReduceSkill[skill_id]) / 100);
|
||||
}
|
||||
|
||||
if (itembonuses.skillmod[skill_id] > 0) {
|
||||
|
||||
if (itembonuses.skillmodmax[skill_id] > 0){
|
||||
|
||||
if (itembonuses.skillmodmax[skill_id] > 0) {
|
||||
return std::min(m_pp.skills[skill_id] + itembonuses.skillmodmax[skill_id], m_pp.skills[skill_id] * (100 + itembonuses.skillmod[skill_id]) / 100);
|
||||
}
|
||||
return m_pp.skills[skill_id] * (100 + itembonuses.skillmod[skill_id]) / 100;
|
||||
}
|
||||
return m_pp.skills[skill_id];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -830,7 +830,7 @@ public:
|
||||
|
||||
void IncreaseSkill(int skill_id, int value = 1) { if (skill_id <= EQ::skills::HIGHEST_SKILL) { m_pp.skills[skill_id] += value; } }
|
||||
void IncreaseLanguageSkill(uint8 language_id, uint8 increase = 1);
|
||||
virtual uint16 GetSkill(EQ::skills::SkillType skill_id) const { if (skill_id <= EQ::skills::HIGHEST_SKILL) { return(itembonuses.skillmod[skill_id] > 0 ? (itembonuses.skillmodmax[skill_id] > 0 ? std::min(m_pp.skills[skill_id] + itembonuses.skillmodmax[skill_id], m_pp.skills[skill_id] * (100 + itembonuses.skillmod[skill_id]) / 100) : m_pp.skills[skill_id] * (100 + itembonuses.skillmod[skill_id]) / 100) : m_pp.skills[skill_id]); } return 0; }
|
||||
virtual uint16 GetSkill(EQ::skills::SkillType skill_id) const;
|
||||
uint32 GetRawSkill(EQ::skills::SkillType skill_id) const { if (skill_id <= EQ::skills::HIGHEST_SKILL) { return(m_pp.skills[skill_id]); } return 0; }
|
||||
bool HasSkill(EQ::skills::SkillType skill_id) const;
|
||||
bool CanHaveSkill(EQ::skills::SkillType skill_id) const;
|
||||
|
||||
@ -503,8 +503,10 @@ struct StatBonuses {
|
||||
uint8 invisibility_verse_undead; // IVU level
|
||||
uint8 invisibility_verse_animal; // IVA level
|
||||
int32 ShieldTargetSpa[2]; // [0] base = % mitigation amount, [1] buff slot
|
||||
uint32 ReduceSkill[EQ::skills::HIGHEST_SKILL + 2]; //reduce value of a skill by percentage
|
||||
int64 FlatMaxHPChange; // base: Max HP change by a flat amount value from spell effect/item worn effect/aa
|
||||
|
||||
|
||||
// AAs
|
||||
int32 TrapCircumvention; // reduce chance to trigger a trap.
|
||||
uint16 SecondaryForte; // allow a second skill to be specialized with a cap of this value.
|
||||
|
||||
@ -3391,6 +3391,8 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove
|
||||
case SE_ImprovedInvisAnimals:
|
||||
case SE_InvisVsUndead:
|
||||
case SE_InvisVsUndead2:
|
||||
case SE_Shield_Target:
|
||||
case SE_ReduceSkill:
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user