diff --git a/common/spdat.h b/common/spdat.h index 863281e4b..0e9c8c027 100644 --- a/common/spdat.h +++ b/common/spdat.h @@ -839,7 +839,7 @@ typedef enum { #define SE_SuspendPet 151 // implemented, @Pet, allow caster to have an extra suspended pet, base: 0=no buffs/items 1=buffs+items, limit: none, max: none #define SE_TemporaryPets 152 // implemented #define SE_BalanceHP 153 // implemented -#define SE_DispelDetrimental 154 // implemented +#define SE_DispelDetrimental 154 // implemented, @Dispel, removes only detrimental effects on a target, base: pct chance (950=95%), limit: none, max: none #define SE_SpellCritDmgIncrease 155 // implemented - no known live spells use this currently #define SE_IllusionCopy 156 // implemented - Deception #define SE_SpellDamageShield 157 // implemented - Petrad's Protection @@ -894,7 +894,7 @@ typedef enum { #define SE_AETaunt 206 // implemented #define SE_FleshToBone 207 // implemented //#define SE_PurgePoison 208 // not used -#define SE_DispelBeneficial 209 // implemented +#define SE_DispelBeneficial 209 // implemented, @Dispel, removes only beneficial effects on a target, base: pct chance (950=95%), limit: none, max: none #define SE_PetShield 210 // implmented, @ShieldAbility, allows pet to 'shield' owner for 50 pct of damage taken for a duration, base: Time multiplier 1=12 seconds, 2=24 ect, limit: mitigation on pet owner override (not on live), max: mitigation on pet overide (not on live) #define SE_AEMelee 211 // implemented TO DO: Implement to allow NPC use (client only atm). #define SE_FrenziedDevastation 212 // implemented - increase spell criticals + all DD spells cast 2x mana. diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index e634e70d3..088d4b2a2 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -1086,14 +1086,19 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove caster->MessageString(Chat::SpellFailure, SPELL_NO_EFFECT, spells[spell_id].name); break; } - + /* + TODO: Parsing shows there is no level modifier. However, a consistent -2% modifer was + found on spell with value 950 (95% spells would have 7% failure rates). + Further investigation is needed. ~ Kayen + */ + int chance = spells[spell_id].base[i]; int buff_count = GetMaxTotalSlots(); for(int slot = 0; slot < buff_count; slot++) { if (buffs[slot].spellid != SPELL_UNKNOWN && IsDetrimentalSpell(buffs[slot].spellid) && spells[buffs[slot].spellid].dispel_flag == 0) { - if (caster && TryDispel(caster->GetLevel(),buffs[slot].casterlevel, effect_value)){ + if (zone->random.Int(1, 1000) <= chance){ BuffFadeBySlot(slot); slot = buff_count; } @@ -1112,14 +1117,15 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove caster->MessageString(Chat::SpellFailure, SPELL_NO_EFFECT, spells[spell_id].name); break; } - + + int chance = spells[spell_id].base[i]; int buff_count = GetMaxTotalSlots(); for(int slot = 0; slot < buff_count; slot++) { if (buffs[slot].spellid != SPELL_UNKNOWN && IsBeneficialSpell(buffs[slot].spellid) && spells[buffs[slot].spellid].dispel_flag == 0) { - if (caster && TryDispel(caster->GetLevel(),buffs[slot].casterlevel, effect_value)){ + if (zone->random.Int(1, 1000) <= chance) { BuffFadeBySlot(slot); slot = buff_count; } @@ -7071,15 +7077,6 @@ uint16 Mob::GetSpellEffectResistChance(uint16 spell_id) bool Mob::TryDispel(uint8 caster_level, uint8 buff_level, int level_modifier){ - /*Live 5-20-14 Patch Note: Updated all spells which use Remove Detrimental and - Cancel Beneficial spell effects to use a new method. The chances for those spells to - affect their targets have not changed unless otherwise noted.*/ - - /*This should provide a somewhat accurate conversion between pre 5/14 base values and post. - until more information is avialble - Kayen*/ - if (level_modifier >= 100) - level_modifier = level_modifier/100; - //Dispels - Check level of caster agianst buffs level (level of the caster who cast the buff) //Effect value of dispels are treated as a level modifier. //Values for scaling were obtain from live parses, best estimates. @@ -7106,7 +7103,6 @@ bool Mob::TryDispel(uint8 caster_level, uint8 buff_level, int level_modifier){ return false; } - bool Mob::ImprovedTaunt(){ if (spellbonuses.ImprovedTaunt[SBIndex::IMPROVED_TAUNT_MAX_LVL]){