mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-19 04:01:29 +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_AttackSpeed3 119 // implemented
|
||||||
#define SE_HealRate 120 // implemented - reduces healing by a %
|
#define SE_HealRate 120 // implemented - reduces healing by a %
|
||||||
#define SE_ReverseDS 121 // implemented
|
#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_Screech 123 // implemented Spell Blocker(If have buff with value +1 will block any effect with -1)
|
||||||
#define SE_ImprovedDamage 124 // implemented
|
#define SE_ImprovedDamage 124 // implemented
|
||||||
#define SE_ImprovedHeal 125 // implemented
|
#define SE_ImprovedHeal 125 // implemented
|
||||||
|
|||||||
@ -2789,6 +2789,25 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses *ne
|
|||||||
break;
|
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:
|
case SE_StunResist:
|
||||||
{
|
{
|
||||||
if(new_bonus->StunResist < effect_value)
|
if(new_bonus->StunResist < effect_value)
|
||||||
|
|||||||
@ -12414,3 +12414,34 @@ std::vector<Mob*> Client::GetRaidOrGroupOrSelf(bool clients_only)
|
|||||||
|
|
||||||
return v;
|
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 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);
|
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; }
|
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 HasSkill(EQ::skills::SkillType skill_id) const;
|
||||||
bool CanHaveSkill(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_undead; // IVU level
|
||||||
uint8 invisibility_verse_animal; // IVA level
|
uint8 invisibility_verse_animal; // IVA level
|
||||||
int32 ShieldTargetSpa[2]; // [0] base = % mitigation amount, [1] buff slot
|
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
|
int64 FlatMaxHPChange; // base: Max HP change by a flat amount value from spell effect/item worn effect/aa
|
||||||
|
|
||||||
|
|
||||||
// AAs
|
// AAs
|
||||||
int32 TrapCircumvention; // reduce chance to trigger a trap.
|
int32 TrapCircumvention; // reduce chance to trigger a trap.
|
||||||
uint16 SecondaryForte; // allow a second skill to be specialized with a cap of this value.
|
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_ImprovedInvisAnimals:
|
||||||
case SE_InvisVsUndead:
|
case SE_InvisVsUndead:
|
||||||
case SE_InvisVsUndead2:
|
case SE_InvisVsUndead2:
|
||||||
|
case SE_Shield_Target:
|
||||||
|
case SE_ReduceSkill:
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user