diff --git a/common/spdat.h b/common/spdat.h index 55af388b5..9061e8725 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 only beneficial 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 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/mob.h b/zone/mob.h index 098d19dac..40967aa72 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -346,6 +346,7 @@ public: uint16 CastingSpellID() const { return casting_spell_id; } bool DoCastingChecks(); bool TryDispel(uint8 caster_level, uint8 buff_level, int level_modifier); + bool TryDispelBeneficialOrDetrimental(uint8 caster_level, uint8 buff_level, int chance); bool TrySpellProjectile(Mob* spell_target, uint16 spell_id, float speed = 1.5f); void ResourceTap(int32 damage, uint16 spell_id); void TryTriggerThreshHold(int32 damage, int effect_id, Mob* attacker); diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index e7e054302..6abccbfa7 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -7057,15 +7057,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. @@ -7092,6 +7083,32 @@ bool Mob::TryDispel(uint8 caster_level, uint8 buff_level, int level_modifier){ return false; } +bool Mob::TryDispelBeneficialOrDetrimental(uint8 caster_level, uint8 buff_level, int chance) { + + /* + Used in SPA 154 and SPA 209 to specifically dispel only beneficial or only detrimental spells. + Formula derived from live parsing. + Baseline chance is 'base' / 10, (ie. 950/10 = 95%) + Chance receives a penality of 0.5% per level, for each level the 'caster of the buff/debuff' is above the caster of the dispel. + There is no bonus percent chance for trying to dispel buff/debuffs cast by mobs lower level than you. + + Ie. Lv 69 Shaman Casts 'Pure Spirit' which has 95% chance to remove deterimental on a debuff cast by a level 85 raid mob. 85-69= 16, + then 16 x 0.5 = 8% penality, thus actual chance to remove is going to be 95-8 = 87% + */ + + int dispel_chance = chance; + int level_diff = caster_level - buff_level; + + if (level_diff < 0) { + dispel_chance += level_diff * 5; + } + + if (zone->random.Int(1,1000) <= dispel_chance) + return true; + else + return false; +} + bool Mob::ImprovedTaunt(){