diff --git a/common/skills.h b/common/skills.h index a589129ed..f7f66b49c 100644 --- a/common/skills.h +++ b/common/skills.h @@ -171,6 +171,8 @@ enum SkillUseTypes // temporary until it can be sorted out... #define HIGHEST_SKILL SkillFrenzy +// Spell Effects use this value to determine if an effect applies to all skills. +#define ALL_SKILLS -1 // server profile does not reflect this yet..so, prefixed with 'PACKET_' #define PACKET_SKILL_ARRAY_SIZE 100 diff --git a/zone/bonuses.cpp b/zone/bonuses.cpp index a76860ce4..c02a7897f 100644 --- a/zone/bonuses.cpp +++ b/zone/bonuses.cpp @@ -701,7 +701,7 @@ void Client::ApplyAABonuses(uint32 aaid, uint32 slots, StatBonuses* newbon) { //Note: AA effects that use accuracy are skill limited, while spell effect is not. case SE_Accuracy: - if ((base2 == -1) && (newbon->Accuracy[HIGHEST_SKILL+1] < base1)) + if ((base2 == ALL_SKILLS) && (newbon->Accuracy[HIGHEST_SKILL+1] < base1)) newbon->Accuracy[HIGHEST_SKILL+1] = base1; else if (newbon->Accuracy[base2] < base1) newbon->Accuracy[base2] += base1; @@ -1043,7 +1043,7 @@ void Client::ApplyAABonuses(uint32 aaid, uint32 slots, StatBonuses* newbon) case SE_HitChance: { - if(base2 == -1) + if(base2 == ALL_SKILLS) newbon->HitChanceEffect[HIGHEST_SKILL+1] += base1; else newbon->HitChanceEffect[base2] += base1; @@ -1099,7 +1099,7 @@ void Client::ApplyAABonuses(uint32 aaid, uint32 slots, StatBonuses* newbon) case SE_CriticalHitChance: { - if(base2 == -1) + if(base2 == ALL_SKILLS) newbon->CriticalHitChance[HIGHEST_SKILL+1] += base1; else newbon->CriticalHitChance[base2] += base1; @@ -1109,7 +1109,7 @@ void Client::ApplyAABonuses(uint32 aaid, uint32 slots, StatBonuses* newbon) case SE_CriticalDamageMob: { // base1 = effect value, base2 = skill restrictions(-1 for all) - if(base2 == -1) + if(base2 == ALL_SKILLS) newbon->CritDmgMob[HIGHEST_SKILL+1] += base1; else newbon->CritDmgMob[base2] += base1; @@ -1137,7 +1137,7 @@ void Client::ApplyAABonuses(uint32 aaid, uint32 slots, StatBonuses* newbon) case SE_SkillDamageAmount: { - if(base2 == -1) + if(base2 == ALL_SKILLS) newbon->SkillDamageAmount[HIGHEST_SKILL+1] += base1; else newbon->SkillDamageAmount[base2] += base1; @@ -1154,7 +1154,7 @@ void Client::ApplyAABonuses(uint32 aaid, uint32 slots, StatBonuses* newbon) case SE_DamageModifier: { - if(base2 == -1) + if(base2 == ALL_SKILLS) newbon->DamageModifier[HIGHEST_SKILL+1] += base1; else newbon->DamageModifier[base2] += base1; @@ -1163,7 +1163,7 @@ void Client::ApplyAABonuses(uint32 aaid, uint32 slots, StatBonuses* newbon) case SE_DamageModifier2: { - if(base2 == -1) + if(base2 == ALL_SKILLS) newbon->DamageModifier2[HIGHEST_SKILL+1] += base1; else newbon->DamageModifier2[base2] += base1; @@ -1873,7 +1873,7 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses* ne case SE_CriticalHitChance: { if (AdditiveWornBonus) { - if(base2 == -1) + if(base2 == ALL_SKILLS) new_bonus->CriticalHitChance[HIGHEST_SKILL+1] += effect_value; else new_bonus->CriticalHitChance[base2] += effect_value; @@ -1881,16 +1881,16 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses* ne else if(effect_value < 0) { - if(base2 == -1 && new_bonus->CriticalHitChance[HIGHEST_SKILL+1] > effect_value) + if(base2 == ALL_SKILLS && new_bonus->CriticalHitChance[HIGHEST_SKILL+1] > effect_value) new_bonus->CriticalHitChance[HIGHEST_SKILL+1] = effect_value; - else if(base2 != -1 && new_bonus->CriticalHitChance[base2] > effect_value) + else if(base2 != ALL_SKILLS && new_bonus->CriticalHitChance[base2] > effect_value) new_bonus->CriticalHitChance[base2] = effect_value; } - else if(base2 == -1 && new_bonus->CriticalHitChance[HIGHEST_SKILL+1] < effect_value) + else if(base2 == ALL_SKILLS && new_bonus->CriticalHitChance[HIGHEST_SKILL+1] < effect_value) new_bonus->CriticalHitChance[HIGHEST_SKILL+1] = effect_value; - else if(base2 != -1 && new_bonus->CriticalHitChance[base2] < effect_value) + else if(base2 != ALL_SKILLS && new_bonus->CriticalHitChance[base2] < effect_value) new_bonus->CriticalHitChance[base2] = effect_value; break; @@ -2068,7 +2068,7 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses* ne { if(new_bonus->MeleeSkillCheck < effect_value) { new_bonus->MeleeSkillCheck = effect_value; - new_bonus->MeleeSkillCheckSkill = base2==-1?255:base2; + new_bonus->MeleeSkillCheckSkill = base2==ALL_SKILLS?255:base2; } break; } @@ -2077,13 +2077,13 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses* ne { if (AdditiveWornBonus){ - if(base2 == -1) + if(base2 == ALL_SKILLS) new_bonus->HitChanceEffect[HIGHEST_SKILL+1] += effect_value; else new_bonus->HitChanceEffect[base2] += effect_value; } - else if(base2 == -1){ + else if(base2 == ALL_SKILLS){ if ((effect_value < 0) && (new_bonus->HitChanceEffect[HIGHEST_SKILL+1] > effect_value)) new_bonus->HitChanceEffect[HIGHEST_SKILL+1] = effect_value; @@ -2109,7 +2109,7 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses* ne case SE_DamageModifier: { - if(base2 == -1) + if(base2 == ALL_SKILLS) new_bonus->DamageModifier[HIGHEST_SKILL+1] += effect_value; else new_bonus->DamageModifier[base2] += effect_value; @@ -2118,7 +2118,7 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses* ne case SE_DamageModifier2: { - if(base2 == -1) + if(base2 == ALL_SKILLS) new_bonus->DamageModifier2[HIGHEST_SKILL+1] += effect_value; else new_bonus->DamageModifier2[base2] += effect_value; @@ -2127,7 +2127,7 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses* ne case SE_MinDamageModifier: { - if(base2 == -1) + if(base2 == ALL_SKILLS) new_bonus->MinDamageModifier[HIGHEST_SKILL+1] += effect_value; else new_bonus->MinDamageModifier[base2] += effect_value; @@ -2225,14 +2225,14 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses* ne { //When using npc_spells_effects if MAX value set, use stackable quest based modifier. if (IsAISpellEffect && max){ - if(base2 == -1) + if(base2 == ALL_SKILLS) SkillDmgTaken_Mod[HIGHEST_SKILL+1] = effect_value; else SkillDmgTaken_Mod[base2] = effect_value; } else { - if(base2 == -1) + if(base2 == ALL_SKILLS) new_bonus->SkillDmgTaken[HIGHEST_SKILL+1] += effect_value; else new_bonus->SkillDmgTaken[base2] += effect_value; @@ -2341,7 +2341,7 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses* ne case SE_CriticalDamageMob: { - if(base2 == -1) + if(base2 == ALL_SKILLS) new_bonus->CritDmgMob[HIGHEST_SKILL+1] += effect_value; else new_bonus->CritDmgMob[base2] += effect_value; @@ -2357,7 +2357,7 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses* ne case SE_SkillDamageAmount: { - if(base2 == -1) + if(base2 == ALL_SKILLS) new_bonus->SkillDamageAmount[HIGHEST_SKILL+1] += effect_value; else new_bonus->SkillDamageAmount[base2] += effect_value; @@ -2462,7 +2462,7 @@ void Mob::ApplySpellsBonuses(uint16 spell_id, uint8 casterlevel, StatBonuses* ne case SE_SkillDamageAmount2: { - if(base2 == -1) + if(base2 == ALL_SKILLS) new_bonus->SkillDamageAmount2[HIGHEST_SKILL+1] += effect_value; else new_bonus->SkillDamageAmount2[base2] += effect_value; diff --git a/zone/mob.cpp b/zone/mob.cpp index 18042381c..b4d28c6c0 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -3550,17 +3550,14 @@ int16 Mob::GetSkillDmgTaken(const SkillUseTypes skill_used) { int skilldmg_mod = 0; - int16 MeleeVuln = spellbonuses.MeleeVulnerability + itembonuses.MeleeVulnerability + aabonuses.MeleeVulnerability; - // All skill dmg mod + Skill specific skilldmg_mod += itembonuses.SkillDmgTaken[HIGHEST_SKILL+1] + spellbonuses.SkillDmgTaken[HIGHEST_SKILL+1] + itembonuses.SkillDmgTaken[skill_used] + spellbonuses.SkillDmgTaken[skill_used]; + - //Innate SetSkillDamgeTaken(skill,value) - if ((SkillDmgTaken_Mod[skill_used]) || (SkillDmgTaken_Mod[HIGHEST_SKILL+1])) - skilldmg_mod += SkillDmgTaken_Mod[skill_used] + SkillDmgTaken_Mod[HIGHEST_SKILL+1]; + skilldmg_mod += SkillDmgTaken_Mod[skill_used] + SkillDmgTaken_Mod[HIGHEST_SKILL+1]; - skilldmg_mod += MeleeVuln; + skilldmg_mod += spellbonuses.MeleeVulnerability + itembonuses.MeleeVulnerability + aabonuses.MeleeVulnerability; if(skilldmg_mod < -100) skilldmg_mod = -100; @@ -4643,22 +4640,21 @@ void Mob::SetBodyType(bodyType new_body, bool overwrite_orig) { void Mob::ModSkillDmgTaken(SkillUseTypes skill_num, int value) { - if (skill_num <= HIGHEST_SKILL) - SkillDmgTaken_Mod[skill_num] = value; - - - else if (skill_num == 255 || skill_num == -1) + if (skill_num == ALL_SKILLS) SkillDmgTaken_Mod[HIGHEST_SKILL+1] = value; + + else if (skill_num >= 0 && skill_num <= HIGHEST_SKILL) + SkillDmgTaken_Mod[skill_num] = value; } int16 Mob::GetModSkillDmgTaken(const SkillUseTypes skill_num) { - if (skill_num <= HIGHEST_SKILL) - return SkillDmgTaken_Mod[skill_num]; - - else if (skill_num == 255 || skill_num == -1) + if (skill_num == ALL_SKILLS) return SkillDmgTaken_Mod[HIGHEST_SKILL+1]; + else if (skill_num >= 0 && skill_num <= HIGHEST_SKILL) + return SkillDmgTaken_Mod[skill_num]; + return 0; } diff --git a/zone/perl_mob.cpp b/zone/perl_mob.cpp index a28d51376..5eeb7be1b 100644 --- a/zone/perl_mob.cpp +++ b/zone/perl_mob.cpp @@ -7783,7 +7783,7 @@ XS(XS_Mob_GetModSkillDmgTaken) Perl_croak(aTHX_ "Usage: Mob::GetModSkillDmgTaken(THIS, skill_num)"); { Mob * THIS; - uint32 RETVAL; + int16 RETVAL; dXSTARG; SkillUseTypes skill_num = (SkillUseTypes)SvUV(ST(1)); @@ -7797,7 +7797,7 @@ XS(XS_Mob_GetModSkillDmgTaken) Perl_croak(aTHX_ "THIS is nullptr, avoiding crash."); RETVAL = THIS->GetModSkillDmgTaken(skill_num); - XSprePUSH; PUSHu((UV)RETVAL); + XSprePUSH; PUSHi((IV)RETVAL); } XSRETURN(1); }