diff options
| -rw-r--r-- | sql/updates/world/2013_01_20_03_world_spell_script_names.sql | 81 | ||||
| -rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 284 | ||||
| -rw-r--r-- | src/server/game/Spells/Spell.cpp | 5 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 191 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_dk.cpp | 107 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_druid.cpp | 205 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_generic.cpp | 155 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_holiday.cpp | 87 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_item.cpp | 225 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_mage.cpp | 178 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_paladin.cpp | 111 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_priest.cpp | 148 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_rogue.cpp | 53 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_shaman.cpp | 31 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_warlock.cpp | 38 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_warrior.cpp | 141 | 
16 files changed, 1447 insertions, 593 deletions
| diff --git a/sql/updates/world/2013_01_20_03_world_spell_script_names.sql b/sql/updates/world/2013_01_20_03_world_spell_script_names.sql new file mode 100644 index 00000000000..0cd28de0472 --- /dev/null +++ b/sql/updates/world/2013_01_20_03_world_spell_script_names.sql @@ -0,0 +1,81 @@ +DELETE FROM `spell_script_names` WHERE `spell_id` IN ( +48792, -- spell_dk_icebound_fortitude +59754, -- spell_dk_rune_tap_party +55233, -- spell_dk_vampiric_blood +-1850, -- spell_dru_dash +48391, -- spell_dru_owlkin_frenzy +29166, -- spell_dru_innervate +34246, -- spell_dru_idol_lifebloom +60779, -- spell_dru_idol_lifebloom +-1079, -- spell_dru_rip +-61391,-- spell_dru_typhoon +63845, -- spell_gen_create_lance +28702, -- spell_gen_netherbloom +28720, -- spell_gen_nightmare_vine +26400, -- spell_item_arcane_shroud +8342,  -- spell_item_goblin_jumper_cables +22999, -- spell_item_goblin_jumper_cables_xl +54732, -- spell_item_gnomish_army_knife +17512, -- spell_item_piccolo_of_the_flaming_fire +48129, -- spell_item_scroll_of_recall +60320, -- spell_item_scroll_of_recall +60321, -- spell_item_scroll_of_recall +28862, -- spell_item_the_eye_of_diminution +-543,  -- spell_mage_fire_frost_ward +-6143, -- spell_mage_fire_frost_ward +-11426,-- spell_mage_ice_barrier +-1463, -- spell_mage_mana_shield +1038,  -- spell_pal_hand_of_salvation +58597, -- spell_pal_sacred_shield +-7001, -- spell_pri_lightwell_renew +-17,   -- spell_pri_power_word_shield +-1943, -- spell_rog_rupture +-51490,-- spell_sha_thunderstorm +-7235, -- spell_warl_shadow_ward +5246,  -- spell_warr_intimidating_shout +-772,  -- spell_warr_rend +64380, -- spell_warr_shattering_throw +65941, -- spell_warr_shattering_throw +50725, -- spell_warr_vigilance_trigger +26275  -- spell_winter_veil_px_238_winter_wondervolt +); +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(48792, 'spell_dk_icebound_fortitude'), +(59754, 'spell_dk_rune_tap_party'), +(55233, 'spell_dk_vampiric_blood'), +(-1850, 'spell_dru_dash'), +(48391, 'spell_dru_owlkin_frenzy'), +(29166, 'spell_dru_innervate'), +(34246, 'spell_dru_idol_lifebloom'), +(60779, 'spell_dru_idol_lifebloom'), +(-1079, 'spell_dru_rip'), +(-61391,'spell_dru_typhoon'), +(63845, 'spell_gen_create_lance'), +(28702, 'spell_gen_netherbloom'), +(28720, 'spell_gen_nightmare_vine'), +(26400, 'spell_item_arcane_shroud'), +(8342,  'spell_item_goblin_jumper_cables'), +(22999, 'spell_item_goblin_jumper_cables_xl'), +(54732, 'spell_item_gnomish_army_knife'), +(17512, 'spell_item_piccolo_of_the_flaming_fire'), +(48129, 'spell_item_scroll_of_recall'), +(60320, 'spell_item_scroll_of_recall'), +(60321, 'spell_item_scroll_of_recall'), +(28862, 'spell_item_the_eye_of_diminution'), +(-543,  'spell_mage_fire_frost_ward'), +(-6143, 'spell_mage_fire_frost_ward'), +(-11426,'spell_mage_ice_barrier'), +(-1463, 'spell_mage_mana_shield'), +(1038,  'spell_pal_hand_of_salvation'), +(58597, 'spell_pal_sacred_shield'), +(-7001, 'spell_pri_lightwell_renew'), +(-17,   'spell_pri_power_word_shield'), +(-1943, 'spell_rog_rupture'), +(-51490,'spell_sha_thunderstorm'), +(-7235, 'spell_warl_shadow_ward'), +(5246,  'spell_warr_intimidating_shout'), +(-772,  'spell_warr_rend'), +(64380, 'spell_warr_shattering_throw'), +(65941, 'spell_warr_shattering_throw'), +(50725, 'spell_warr_vigilance_trigger'), +(26275, 'spell_winter_veil_px_238_winter_wondervolt'); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 3b5c6131c5a..05da36d2ccc 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -483,112 +483,8 @@ int32 AuraEffect::CalculateAmount(Unit* caster)              }              break;          case SPELL_AURA_SCHOOL_ABSORB: -            m_canBeRecalculated = false; -            if (!caster) -                break; -            switch (GetSpellInfo()->SpellFamilyName) -            { -                case SPELLFAMILY_MAGE: -                    // Ice Barrier -                    if (GetSpellInfo()->SpellFamilyFlags[1] & 0x1 && GetSpellInfo()->SpellFamilyFlags[2] & 0x8) -                    { -                        // +80.68% from sp bonus -                        DoneActualBenefit += caster->SpellBaseDamageBonusDone(m_spellInfo->GetSchoolMask()) * 0.8068f; -                        // Glyph of Ice Barrier: its weird having a SPELLMOD_ALL_EFFECTS here but its blizzards doing :) -                        // Glyph of Ice Barrier is only applied at the spell damage bonus because it was already applied to the base value in CalculateSpellDamage -                        DoneActualBenefit = caster->ApplyEffectModifiers(GetSpellInfo(), m_effIndex, DoneActualBenefit); -                    } -                    // Fire Ward -                    else if (GetSpellInfo()->SpellFamilyFlags[0] & 0x8 && GetSpellInfo()->SpellFamilyFlags[2] & 0x8) -                    { -                        // +80.68% from sp bonus -                        DoneActualBenefit += caster->SpellBaseDamageBonusDone(m_spellInfo->GetSchoolMask()) * 0.8068f; -                    } -                    // Frost Ward -                    else if (GetSpellInfo()->SpellFamilyFlags[0] & 0x100 && GetSpellInfo()->SpellFamilyFlags[2] & 0x8) -                    { -                        // +80.68% from sp bonus -                        DoneActualBenefit += caster->SpellBaseDamageBonusDone(m_spellInfo->GetSchoolMask()) * 0.8068f; -                    } -                    break; -                case SPELLFAMILY_WARLOCK: -                    // Shadow Ward -                    if (m_spellInfo->SpellFamilyFlags[2] & 0x40) -                    { -                        // +80.68% from sp bonus -                        DoneActualBenefit += caster->SpellBaseDamageBonusDone(m_spellInfo->GetSchoolMask()) * 0.8068f; -                    } -                    break; -                case SPELLFAMILY_PRIEST: -                    // Power Word: Shield -                    if (GetSpellInfo()->SpellFamilyFlags[0] & 0x1 && GetSpellInfo()->SpellFamilyFlags[2] & 0x400) -                    { -                        // +80.68% from sp bonus -                        float bonus = 0.8068f; - -                        // Borrowed Time -                        if (AuraEffect const* pAurEff = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, 2899, 1)) -                            bonus += CalculatePct(1.0f, pAurEff->GetAmount()); - -                        DoneActualBenefit += caster->SpellBaseHealingBonusDone(m_spellInfo->GetSchoolMask()) * bonus; -                        // Improved PW: Shield: its weird having a SPELLMOD_ALL_EFFECTS here but its blizzards doing :) -                        // Improved PW: Shield is only applied at the spell healing bonus because it was already applied to the base value in CalculateSpellDamage -                        DoneActualBenefit = caster->ApplyEffectModifiers(GetSpellInfo(), m_effIndex, DoneActualBenefit); -                        DoneActualBenefit *= caster->CalculateLevelPenalty(GetSpellInfo()); - -                        amount += int32(DoneActualBenefit); - -                        // Twin Disciplines -                        if (AuraEffect const* pAurEff = caster->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_PRIEST, 0x400000, 0, 0, caster->GetGUID())) -                            AddPct(amount, pAurEff->GetAmount()); - -                        // Focused Power -                        // Reuse variable, not sure if this code below can be moved before Twin Disciplines -                        DoneActualBenefit = float(amount); -                        DoneActualBenefit *= caster->GetTotalAuraMultiplier(SPELL_AURA_MOD_HEALING_DONE_PERCENT); -                        amount = int32(DoneActualBenefit); - -                        return amount; -                    } -                    break; -                case SPELLFAMILY_PALADIN: -                    // Sacred Shield -                    if (m_spellInfo->SpellFamilyFlags[1] & 0x80000) -                    { -                        //+75.00% from sp bonus -                        float bonus = 0.75f; - -                        DoneActualBenefit += caster->SpellBaseHealingBonusDone(m_spellInfo->GetSchoolMask()) * bonus; -                        // Divine Guardian is only applied at the spell healing bonus because it was already applied to the base value in CalculateSpellDamage -                        DoneActualBenefit = caster->ApplyEffectModifiers(GetSpellInfo(), m_effIndex, DoneActualBenefit); -                        DoneActualBenefit *= caster->CalculateLevelPenalty(GetSpellInfo()); - -                        amount += (int32)DoneActualBenefit; - -                        // Arena - Dampening -                        AuraEffect const* pAurEff = caster->GetAuraEffect(74410, 0); -                        if (!pAurEff) -                            pAurEff = caster->GetAuraEffect(74411, 0);  // Battleground - Dampening -                        if (pAurEff) -                            AddPct(amount, pAurEff->GetAmount()); - -                        return amount; -                    } -                    break; -                default: -                    break; -            } -            break;          case SPELL_AURA_MANA_SHIELD:              m_canBeRecalculated = false; -            if (!caster) -                break; -            // Mana Shield -            if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_MAGE && GetSpellInfo()->SpellFamilyFlags[0] & 0x8000 && m_spellInfo->SpellFamilyFlags[2] & 0x8) -            { -                // +80.53% from +spd bonus -                DoneActualBenefit += caster->SpellBaseDamageBonusDone(m_spellInfo->GetSchoolMask()) * 0.8053f; -            }              break;          case SPELL_AURA_DUMMY:              if (!caster) @@ -600,161 +496,9 @@ int32 AuraEffect::CalculateAmount(Unit* caster)                  amount = GetBase()->GetUnitOwner()->SpellHealingBonusTaken(caster, GetSpellInfo(), amount, SPELL_DIRECT_DAMAGE);              }              break; -        case SPELL_AURA_PERIODIC_DAMAGE: -            if (!caster) -                break; -            // Rupture -            if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_ROGUE && m_spellInfo->SpellFamilyFlags[0] & 0x100000) -            { -                m_canBeRecalculated = false; -                if (caster->GetTypeId() != TYPEID_PLAYER) -                    break; -                //1 point : ${($m1+$b1*1+0.015*$AP)*4} damage over 8 secs -                //2 points: ${($m1+$b1*2+0.024*$AP)*5} damage over 10 secs -                //3 points: ${($m1+$b1*3+0.03*$AP)*6} damage over 12 secs -                //4 points: ${($m1+$b1*4+0.03428571*$AP)*7} damage over 14 secs -                //5 points: ${($m1+$b1*5+0.0375*$AP)*8} damage over 16 secs -                float AP_per_combo[6] = {0.0f, 0.015f, 0.024f, 0.03f, 0.03428571f, 0.0375f}; -                uint8 cp = caster->ToPlayer()->GetComboPoints(); -                if (cp > 5) cp = 5; -                amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * AP_per_combo[cp]); -            } -            // Rip -            else if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_DRUID && m_spellInfo->SpellFamilyFlags[0] & 0x00800000 && GetAuraType() == SPELL_AURA_PERIODIC_DAMAGE) -            { -                m_canBeRecalculated = false; -                // 0.01*$AP*cp -                if (caster->GetTypeId() != TYPEID_PLAYER) -                    break; - -                uint8 cp = caster->ToPlayer()->GetComboPoints(); - -                // Idol of Feral Shadows. Cant be handled as SpellMod in SpellAura:Dummy due its dependency from CPs -                if (AuraEffect const* aurEff = caster->GetAuraEffect(34241, EFFECT_0)) -                    amount += cp * aurEff->GetAmount(); -                // Idol of Worship. Cant be handled as SpellMod in SpellAura:Dummy due its dependency from CPs -                else if (AuraEffect const* aurEff = caster->GetAuraEffect(60774, EFFECT_0)) -                    amount += cp * aurEff->GetAmount(); - -                amount += uint32(CalculatePct(caster->GetTotalAttackPowerValue(BASE_ATTACK), cp)); -            } -            // Rend -            else if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_WARRIOR && GetSpellInfo()->SpellFamilyFlags[0] & 0x20) -            { -                m_canBeRecalculated = false; -                // $0.2 * (($MWB + $mwb) / 2 + $AP / 14 * $MWS) bonus per tick -                float ap = caster->GetTotalAttackPowerValue(BASE_ATTACK); -                int32 mws = caster->GetAttackTime(BASE_ATTACK); -                float mwb_min = caster->GetWeaponDamageRange(BASE_ATTACK, MINDAMAGE); -                float mwb_max = caster->GetWeaponDamageRange(BASE_ATTACK, MAXDAMAGE); -                float mwb = ((mwb_min + mwb_max) / 2 + ap * mws / 14000) * 0.2f; -                amount += int32(caster->ApplyEffectModifiers(m_spellInfo, m_effIndex, mwb)); -                // "If used while your target is above 75% health, Rend does 35% more damage." -                // as for 3.1.3 only ranks above 9 (wrong tooltip?) -                if (m_spellInfo->GetRank() >= 9) -                { -                    if (GetBase()->GetUnitOwner()->HasAuraState(AURA_STATE_HEALTH_ABOVE_75_PERCENT, m_spellInfo, caster)) -                        AddPct(amount, m_spellInfo->Effects[EFFECT_2].CalcValue(caster)); -                } -            } -            break; -        case SPELL_AURA_PERIODIC_ENERGIZE: -            switch (m_spellInfo->Id) -            { -                case 29166: // Innervate -                    ApplyPct(amount, float(GetBase()->GetUnitOwner()->GetCreatePowers(POWER_MANA)) / GetTotalTicks()); -                    break; -                case 48391: // Owlkin Frenzy -                    ApplyPct(amount, GetBase()->GetUnitOwner()->GetCreatePowers(POWER_MANA)); -                    break; -                default: -                    break; -            } -            break; -        case SPELL_AURA_PERIODIC_HEAL: -            if (!caster) -                break; -            // Lightwell Renew -            if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_PRIEST && m_spellInfo->SpellFamilyFlags[2] & 0x4000) -            { -                if (caster->GetTypeId() == TYPEID_PLAYER) -                // Bonus from Glyph of Lightwell -                if (AuraEffect* modHealing = caster->GetAuraEffect(55673, 0)) -                    AddPct(amount, modHealing->GetAmount()); -            } -            break; -        case SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN: -            if (!caster) -                break; -            // Icebound Fortitude -            if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && m_spellInfo->SpellFamilyFlags[0] & 0x00100000) -            { -                if (caster->GetTypeId() == TYPEID_PLAYER) -                { -                    int32 value = (-1 * amount) - 10; -                    uint32 defva = uint32(caster->ToPlayer()->GetSkillValue(SKILL_DEFENSE) + caster->ToPlayer()->GetRatingBonusValue(CR_DEFENSE_SKILL)); - -                    if (defva > 400) -                        value += int32((defva - 400) * 0.15); - -                    // Glyph of Icebound Fortitude -                    if (AuraEffect const* aurEff = caster->GetAuraEffect(58625, 0)) -                    { -                        int32 valMax = aurEff->GetAmount(); -                        if (value < valMax) -                            value = valMax; -                    } -                    amount = -value; -                } -            } -            // Hand of Salvation -            else if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_PALADIN && GetSpellInfo()->SpellFamilyFlags[0] & 0x00000100) -            { -                //Glyph of Salvation -                if (caster->GetGUID() == GetBase()->GetUnitOwner()->GetGUID()) -                    if (AuraEffect const* aurEff = caster->GetAuraEffect(63225, 0)) -                        amount = -aurEff->GetAmount(); -            } -            break; -        case SPELL_AURA_MOD_THREAT: -        { -            uint8 level_diff = 0; -            float multiplier = 0.0f; -            switch (GetId()) -            { -                // Arcane Shroud -                case 26400: -                    level_diff = GetBase()->GetUnitOwner()->getLevel() - 60; -                    multiplier = 2; -                    break; -                // The Eye of Diminution -                case 28862: -                    level_diff = GetBase()->GetUnitOwner()->getLevel() - 60; -                    multiplier = 1; -                    break; -            } -            if (level_diff > 0) -                amount += int32(multiplier * level_diff); -            break; -        } -        case SPELL_AURA_MOD_INCREASE_HEALTH: -            // Vampiric Blood -            if (GetId() == 55233) -                amount = GetBase()->GetUnitOwner()->CountPctFromMaxHealth(amount); -            break; -        case SPELL_AURA_MOD_INCREASE_SPEED: -            // Dash - do not set speed if not in cat form -            if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_DRUID && GetSpellInfo()->SpellFamilyFlags[2] & 0x00000008) -                amount = GetBase()->GetUnitOwner()->GetShapeshiftForm() == FORM_CAT ? amount : 0; -            break;          default:              break;      } -    if (DoneActualBenefit != 0.0f) -    { -        DoneActualBenefit *= caster->CalculateLevelPenalty(GetSpellInfo()); -        amount += (int32)DoneActualBenefit; -    }      GetBase()->CallScriptEffectCalcAmountHandlers(const_cast<AuraEffect const*>(this), amount, m_canBeRecalculated);      amount *= GetBase()->GetStackAmount(); @@ -848,32 +592,6 @@ void AuraEffect::CalculateSpellMod()  {      switch (GetAuraType())      { -        case SPELL_AURA_DUMMY: -            switch (GetSpellInfo()->SpellFamilyName) -            { -                case SPELLFAMILY_DRUID: -                    switch (GetId()) -                    { -                        case 34246:                                 // Idol of the Emerald Queen -                        case 60779:                                 // Idol of Lush Moss -                        { -                            if (!m_spellmod) -                            { -                                m_spellmod = new SpellModifier(GetBase()); -                                m_spellmod->op = SPELLMOD_DOT; -                                m_spellmod->type = SPELLMOD_FLAT; -                                m_spellmod->spellId = GetId(); -                                m_spellmod->mask[1] = 0x0010; -                            } -                            m_spellmod->value = GetAmount()/7; -                        } -                        break; -                    } -                    break; -                default: -                    break; -            } -            break;          case SPELL_AURA_ADD_FLAT_MODIFIER:          case SPELL_AURA_ADD_PCT_MODIFIER:              if (!m_spellmod) @@ -882,7 +600,7 @@ void AuraEffect::CalculateSpellMod()                  m_spellmod->op = SpellModOp(GetMiscValue());                  ASSERT(m_spellmod->op < MAX_SPELLMOD); -                m_spellmod->type = SpellModType(GetAuraType());    // SpellModType value == spell aura types +                m_spellmod->type = SpellModType(GetAuraType()); // SpellModType value == spell aura types                  m_spellmod->spellId = GetId();                  m_spellmod->mask = GetSpellInfo()->Effects[GetEffIndex()].SpellClassMask;                  m_spellmod->charges = GetBase()->GetCharges(); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 9bb3eaa31f1..054f6a109db 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -1345,11 +1345,6 @@ void Spell::SelectImplicitAreaTargets(SpellEffIndex effIndex, SpellImplicitTarge              }          } -        // todo: move to scripts, but we must call it before resize list by MaxAffectedTargets -        // Intimidating Shout -        if (m_spellInfo->Id == 5246 && effIndex != EFFECT_0) -            unitTargets.remove(m_targets.GetUnitTarget()); -          // Other special target selection goes here          if (uint32 maxTargets = m_spellValue->MaxAffectedTargets)          { diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 1dddb08be0b..4fdf6654cba 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -883,12 +883,6 @@ void Spell::EffectTriggerSpell(SpellEffIndex effIndex)                      m_caster->CastSpell(unitTarget, spell->Id, true);                  return;              } -            // Righteous Defense -            case 31980: -            { -                m_caster->CastSpell(unitTarget, 31790, true); -                return; -            }              // Cloak of Shadows              case 35729:              { @@ -1139,32 +1133,8 @@ void Spell::EffectTeleportUnits(SpellEffIndex /*effIndex*/)          return;      // Pre effects -    uint8 uiMaxSafeLevel = 0;      switch (m_spellInfo->Id)      { -        case 48129:  // Scroll of Recall -            uiMaxSafeLevel = 40; -        case 60320:  // Scroll of Recall II -            if (!uiMaxSafeLevel) -                uiMaxSafeLevel = 70; -        case 60321:  // Scroll of Recal III -            if (!uiMaxSafeLevel) -                uiMaxSafeLevel = 80; - -            if (unitTarget->getLevel() > uiMaxSafeLevel) -            { -                unitTarget->AddAura(60444, unitTarget); //Apply Lost! Aura - -                // ALLIANCE from 60323 to 60330 - HORDE from 60328 to 60335 -                uint32 spellId = 60323; -                if (m_caster->ToPlayer()->GetTeam() == HORDE) -                    spellId += 5; - -                spellId += urand(0, 7); -                m_caster->CastSpell(m_caster, spellId, true); -                return; -            } -            break;          case 66550: // teleports outside (Isle of Conquest)              if (Player* target = unitTarget->ToPlayer())              { @@ -1188,7 +1158,7 @@ void Spell::EffectTeleportUnits(SpellEffIndex /*effIndex*/)      // If not exist data for dest location - return      if (!m_targets.HasDst())      { -        sLog->outError(LOG_FILTER_SPELLS_AURAS, "Spell::EffectTeleportUnits - does not have destination for spell ID %u\n", m_spellInfo->Id); +        sLog->outError(LOG_FILTER_SPELLS_AURAS, "Spell::EffectTeleportUnits - does not have destination for spellId %u.", m_spellInfo->Id);          return;      } @@ -1585,10 +1555,6 @@ void Spell::EffectHealPct(SpellEffIndex /*effIndex*/)      if (!m_originalCaster)          return; -    // Rune Tap - Party -    if (m_spellInfo->Id == 59754 && unitTarget == m_caster) -        return; -      uint32 heal = m_originalCaster->SpellHealingBonusDone(unitTarget, m_spellInfo, unitTarget->CountPctFromMaxHealth(damage), HEAL);      heal = unitTarget->SpellHealingBonusTaken(m_originalCaster, m_spellInfo, heal, HEAL); @@ -3732,23 +3698,6 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex)                          return;                      unitTarget->RemoveAurasDueToSpell(m_spellInfo->Effects[effIndex].CalcValue());                      break; -                // PX-238 Winter Wondervolt TRAP -                case 26275: -                { -                    uint32 spells[4] = { 26272, 26157, 26273, 26274 }; - -                    // check presence -                    for (uint8 j = 0; j < 4; ++j) -                        if (unitTarget->HasAuraEffect(spells[j], 0)) -                            return; - -                    // select spell -                    uint32 iTmpSpellId = spells[urand(0, 3)]; - -                    // cast -                    unitTarget->CastSpell(unitTarget, iTmpSpellId, true); -                    return; -                }                  // Bending Shinbone                  case 8856:                  { @@ -3794,14 +3743,6 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex)                      m_caster->CastSpell(unitTarget, 22682, true);                      return;                  } -                // Piccolo of the Flaming Fire -                case 17512: -                { -                    if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) -                        return; -                    unitTarget->HandleEmoteCommand(EMOTE_STATE_DANCE); -                    return; -                }                  // Decimate                  case 28374:                  case 54426: @@ -3944,17 +3885,6 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex)                      m_caster->MonsterTextEmote(buf, 0);                      break;                  } -                // Vigilance -                case 50725: -                { -                    if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) -                        return; - -                    // Remove Taunt cooldown -                    unitTarget->ToPlayer()->RemoveSpellCooldown(355, true); - -                    return; -                }                  // Death Knight Initiate Visual                  case 51519:                  { @@ -4113,17 +4043,6 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex)                      }                      return;                  } -                case 63845: // Create Lance -                { -                    if (m_caster->GetTypeId() != TYPEID_PLAYER) -                        return; - -                    if (m_caster->ToPlayer()->GetTeam() == ALLIANCE) -                        m_caster->CastSpell(m_caster, 63914, true); -                    else -                        m_caster->CastSpell(m_caster, 63919, true); -                    return; -                }                  case 59317:                                 // Teleporting                  { @@ -4317,46 +4236,6 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex)                  return;              }          } -        case SPELLFAMILY_POTION: -        { -            switch (m_spellInfo->Id) -            { -                // Netherbloom -                case 28702: -                { -                    if (!unitTarget) -                        return; -                    // 25% chance of casting a random buff -                    if (roll_chance_i(75)) -                        return; - -                    // triggered spells are 28703 to 28707 -                    // Note: some sources say, that there was the possibility of -                    //       receiving a debuff. However, this seems to be removed by a patch. -                    const uint32 spellid = 28703; - -                    // don't overwrite an existing aura -                    for (uint8 i = 0; i < 5; ++i) -                        if (unitTarget->HasAura(spellid + i)) -                            return; -                    unitTarget->CastSpell(unitTarget, spellid+urand(0, 4), true); -                    break; -                } - -                // Nightmare Vine -                case 28720: -                { -                    if (!unitTarget) -                        return; -                    // 25% chance of casting Nightmare Pollen -                    if (roll_chance_i(75)) -                        return; -                    unitTarget->CastSpell(unitTarget, 28721, true); -                    break; -                } -            } -            break; -        }          case SPELLFAMILY_DEATHKNIGHT:          {              // Pestilence @@ -4377,19 +4256,6 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex)              }              break;          } -        case SPELLFAMILY_WARRIOR: -        { -            // Shattering Throw -            if (m_spellInfo->SpellFamilyFlags[1] & 0x00400000) -            { -                if (!unitTarget) -                    return; -                // remove shields, will still display immune to damage part -                unitTarget->RemoveAurasWithMechanic(1<<MECHANIC_IMMUNE_SHIELD, AURA_REMOVE_BY_ENEMY_SPELL); -                return; -            } -            break; -        }      }      // normal DB scripted effect @@ -4868,44 +4734,11 @@ void Spell::EffectResurrect(SpellEffIndex effIndex)      if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)          return; -    if (!unitTarget) -        return; -    if (unitTarget->GetTypeId() != TYPEID_PLAYER) +    if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER)          return; -    if (unitTarget->isAlive()) +    if (unitTarget->isAlive() || !unitTarget->IsInWorld())          return; -    if (!unitTarget->IsInWorld()) -        return; - -    switch (m_spellInfo->Id) -    { -        // Defibrillate (Goblin Jumper Cables) have 33% chance on success -        case 8342: -            if (roll_chance_i(67)) -            { -                m_caster->CastSpell(m_caster, 8338, true, m_CastItem); -                return; -            } -            break; -        // Defibrillate (Goblin Jumper Cables XL) have 50% chance on success -        case 22999: -            if (roll_chance_i(50)) -            { -                m_caster->CastSpell(m_caster, 23055, true, m_CastItem); -                return; -            } -            break; -        // Defibrillate (Gnomish Army Knife) have 67% chance on success_list -        case 54732: -            if (roll_chance_i(33)) -            { -                return; -            } -            break; -        default: -            break; -    }      Player* target = unitTarget->ToPlayer(); @@ -5151,26 +4984,10 @@ void Spell::EffectKnockBack(SpellEffIndex effIndex)          if (creatureTarget->isWorldBoss() || creatureTarget->IsDungeonBoss())              return; -    // Spells with SPELL_EFFECT_KNOCK_BACK(like Thunderstorm) can't knoback target if target has ROOT/STUN +    // Spells with SPELL_EFFECT_KNOCK_BACK (like Thunderstorm) can't knockback target if target has ROOT/STUN      if (unitTarget->HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED))          return; -    // Typhoon -    if (m_spellInfo->SpellFamilyName == SPELLFAMILY_DRUID && m_spellInfo->SpellFamilyFlags[1] & 0x01000000) -    { -        // Glyph of Typhoon -        if (m_caster->HasAura(62135)) -            return; -    } - -    // Thunderstorm -    if (m_spellInfo->SpellFamilyName == SPELLFAMILY_SHAMAN && m_spellInfo->SpellFamilyFlags[1] & 0x00002000) -    { -        // Glyph of Thunderstorm -        if (m_caster->HasAura(62132)) -            return; -    } -      // Instantly interrupt non melee spells being casted      if (unitTarget->IsNonMeleeSpellCasted(true))          unitTarget->InterruptNonMeleeSpells(true); diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp index 060db02d53c..62a0599dab1 100644 --- a/src/server/scripts/Spells/spell_dk.cpp +++ b/src/server/scripts/Spells/spell_dk.cpp @@ -37,6 +37,7 @@ enum DeathKnightSpells      SPELL_DK_DEATH_COIL_HEAL                    = 47633,      SPELL_DK_DEATH_STRIKE_HEAL                  = 45470,      SPELL_DK_GHOUL_EXPLODE                      = 47496, +    SPELL_DK_GLYPH_OF_ICEBOUND_FORTITUDE        = 58625,      SPELL_DK_RUNIC_POWER_ENERGIZE               = 49088,      SPELL_DK_SCOURGE_STRIKE_TRIGGERED           = 70890,      SPELL_DK_WILL_OF_THE_NECROPOLIS_TALENT_R1   = 49189, @@ -584,6 +585,55 @@ class spell_dk_ghoul_explode : public SpellScriptLoader          }  }; +// 48792 - Icebound Fortitude +class spell_dk_icebound_fortitude : public SpellScriptLoader +{ +    public: +        spell_dk_icebound_fortitude() : SpellScriptLoader("spell_dk_icebound_fortitude") { } + +        class spell_dk_icebound_fortitude_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_dk_icebound_fortitude_AuraScript); + +            bool Load() +            { +                Unit* caster = GetCaster(); +                return caster && caster->GetTypeId() == TYPEID_PLAYER; +            } + +            void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) +            { +                if (Unit* caster = GetCaster()) +                { +                    int32 value = amount; +                    uint32 defValue = uint32(caster->ToPlayer()->GetSkillValue(SKILL_DEFENSE) + caster->ToPlayer()->GetRatingBonusValue(CR_DEFENSE_SKILL)); + +                    if (defValue > 400) +                        value -= int32((defValue - 400) * 0.15); + +                    // Glyph of Icebound Fortitude +                    if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_DK_GLYPH_OF_ICEBOUND_FORTITUDE, EFFECT_0)) +                    { +                        int32 valMax = -aurEff->GetAmount(); +                        if (value > valMax) +                            value = valMax; +                    } +                    amount = value; +                } +            } + +            void Register() +            { +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_icebound_fortitude_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN); +            } +        }; + +        AuraScript* GetAuraScript() const +        { +            return new spell_dk_icebound_fortitude_AuraScript(); +        } +}; +  // 50365, 50371 - Improved Blood Presence  class spell_dk_improved_blood_presence : public SpellScriptLoader  { @@ -677,6 +727,33 @@ class spell_dk_improved_unholy_presence : public SpellScriptLoader          }  }; +// 59754 Rune Tap - Party +class spell_dk_rune_tap_party : public SpellScriptLoader +{ +    public: +        spell_dk_rune_tap_party() : SpellScriptLoader("spell_dk_rune_tap_party") { } + +        class spell_dk_rune_tap_party_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_dk_rune_tap_party_SpellScript); + +            void CheckTargets(std::list<WorldObject*>& targets) +            { +                targets.remove(GetCaster()); +            } + +            void Register() +            { +                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_dk_rune_tap_party_SpellScript::CheckTargets, EFFECT_0, TARGET_UNIT_CASTER_AREA_PARTY); +            } +        }; + +        SpellScript* GetSpellScript() const +        { +            return new spell_dk_rune_tap_party_SpellScript(); +        } +}; +  // 55090 - Scourge Strike (55265, 55270, 55271)  class spell_dk_scourge_strike : public SpellScriptLoader  { @@ -784,6 +861,33 @@ class spell_dk_spell_deflection : public SpellScriptLoader          }  }; +// 55233 - Vampiric Blood +class spell_dk_vampiric_blood : public SpellScriptLoader +{ +    public: +        spell_dk_vampiric_blood() : SpellScriptLoader("spell_dk_vampiric_blood") { } + +        class spell_dk_vampiric_blood_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_dk_vampiric_blood_AuraScript); + +            void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) +            { +                amount = GetUnitOwner()->CountPctFromMaxHealth(amount); +            } + +            void Register() +            { +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dk_vampiric_blood_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_INCREASE_HEALTH); +            } +        }; + +        AuraScript* GetAuraScript() const +        { +            return new spell_dk_vampiric_blood_AuraScript(); +        } +}; +  // 52284 - Will of the Necropolis  class spell_dk_will_of_the_necropolis : public SpellScriptLoader  { @@ -861,9 +965,12 @@ void AddSC_deathknight_spell_scripts()      new spell_dk_death_pact();      new spell_dk_death_strike();      new spell_dk_ghoul_explode(); +    new spell_dk_icebound_fortitude();      new spell_dk_improved_blood_presence();      new spell_dk_improved_unholy_presence(); +    new spell_dk_rune_tap_party();      new spell_dk_scourge_strike();      new spell_dk_spell_deflection(); +    new spell_dk_vampiric_blood();      new spell_dk_will_of_the_necropolis();  } diff --git a/src/server/scripts/Spells/spell_druid.cpp b/src/server/scripts/Spells/spell_druid.cpp index 6dd453597de..e2b918e1c7f 100644 --- a/src/server/scripts/Spells/spell_druid.cpp +++ b/src/server/scripts/Spells/spell_druid.cpp @@ -30,6 +30,9 @@  enum DruidSpells  {      SPELL_DRUID_ENRAGE_MOD_DAMAGE           = 51185, +    SPELL_DRUID_GLYPH_OF_TYPHOON            = 62135, +    SPELL_DRUID_IDOL_OF_FERAL_SHADOWS       = 34241, +    SPELL_DRUID_IDOL_OF_WORSHIP             = 60774,      SPELL_DRUID_INCREASED_MOONFIRE_DURATION = 38414,      SPELL_DRUID_KING_OF_THE_JUNGLE          = 48492,      SPELL_DRUID_LIFEBLOOM_ENERGIZE          = 64372, @@ -41,6 +44,35 @@ enum DruidSpells      SPELL_DRUID_ITEM_T8_BALANCE_RELIC       = 64950,  }; +// -1850 - Dash +class spell_dru_dash : public SpellScriptLoader +{ +    public: +        spell_dru_dash() : SpellScriptLoader("spell_dru_dash") { } + +        class spell_dru_dash_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_dru_dash_AuraScript); + +            void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) +            { +                // do not set speed if not in cat form +                if (GetUnitOwner()->GetShapeshiftForm() != FORM_CAT) +                    amount = 0; +            } + +            void Register() +            { +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_dash_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_INCREASE_SPEED); +            } +        }; + +        AuraScript* GetAuraScript() const +        { +            return new spell_dru_dash_AuraScript(); +        } +}; +  // -5229 - Enrage  class spell_dru_enrage : public SpellScriptLoader  { @@ -121,6 +153,69 @@ class spell_dru_glyph_of_starfire : public SpellScriptLoader          }  }; +// 34246 - Idol of the Emerald Queen +// 60779 - Idol of Lush Moss +class spell_dru_idol_lifebloom : public SpellScriptLoader +{ +    public: +        spell_dru_idol_lifebloom() : SpellScriptLoader("spell_dru_idol_lifebloom") { } + +        class spell_dru_idol_lifebloom_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_dru_idol_lifebloom_AuraScript); + +            void HandleEffectCalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod) +            { +                if (!spellMod) +                { +                    spellMod = new SpellModifier(GetAura()); +                    spellMod->op = SPELLMOD_DOT; +                    spellMod->type = SPELLMOD_FLAT; +                    spellMod->spellId = GetId(); +                    spellMod->mask = GetSpellInfo()->Effects[aurEff->GetEffIndex()].SpellClassMask; +                } +                spellMod->value = aurEff->GetAmount() / 7; +            } + +            void Register() +            { +                DoEffectCalcSpellMod += AuraEffectCalcSpellModFn(spell_dru_idol_lifebloom_AuraScript::HandleEffectCalcSpellMod, EFFECT_0, SPELL_AURA_DUMMY); +            } +        }; + +        AuraScript* GetAuraScript() const +        { +            return new spell_dru_idol_lifebloom_AuraScript(); +        } +}; + +// 29166 - Innervate +class spell_dru_innervate : public SpellScriptLoader +{ +    public: +        spell_dru_innervate() : SpellScriptLoader("spell_dru_innervate") { } + +        class spell_dru_innervate_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_dru_innervate_AuraScript); + +            void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) +            { +                amount = CalculatePct(int32(GetUnitOwner()->GetCreatePowers(POWER_MANA) / aurEff->GetTotalTicks()), amount); +            } + +            void Register() +            { +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_innervate_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_ENERGIZE); +            } +        }; + +        AuraScript* GetAuraScript() const +        { +            return new spell_dru_innervate_AuraScript(); +        } +}; +  // -5570 - Insect Swarm  class spell_dru_insect_swarm : public SpellScriptLoader  { @@ -276,6 +371,33 @@ class spell_dru_moonkin_form_passive : public SpellScriptLoader          }  }; +// 48391 - Owlkin Frenzy +class spell_dru_owlkin_frenzy : public SpellScriptLoader +{ +    public: +        spell_dru_owlkin_frenzy() : SpellScriptLoader("spell_dru_owlkin_frenzy") { } + +        class spell_dru_owlkin_frenzy_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_dru_owlkin_frenzy_AuraScript); + +            void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) +            { +                amount = CalculatePct(GetUnitOwner()->GetCreatePowers(POWER_MANA), amount); +            } + +            void Register() +            { +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_owlkin_frenzy_AuraScript::CalculateAmount, EFFECT_2, SPELL_AURA_PERIODIC_ENERGIZE); +            } +        }; + +        AuraScript* GetAuraScript() const +        { +            return new spell_dru_owlkin_frenzy_AuraScript(); +        } +}; +  // -16972 - Predatory Strikes  class spell_dru_predatory_strikes : public SpellScriptLoader  { @@ -349,6 +471,54 @@ class spell_dru_primal_tenacity : public SpellScriptLoader          }  }; +// -1079 - Rip +class spell_dru_rip : public SpellScriptLoader +{ +    public: +        spell_dru_rip() : SpellScriptLoader("spell_dru_rip") { } + +        class spell_dru_rip_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_dru_rip_AuraScript); + +            bool Load() +            { +                Unit* caster = GetCaster(); +                return caster && caster->GetTypeId() == TYPEID_PLAYER; +            } + +            void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) +            { +                canBeRecalculated = false; + +                if (Unit* caster = GetCaster()) +                { +                    // 0.01 * $AP * cp +                    uint8 cp = caster->ToPlayer()->GetComboPoints(); + +                    // Idol of Feral Shadows. Can't be handled as SpellMod due its dependency from CPs +                    if (AuraEffect const* idol = caster->GetAuraEffect(SPELL_DRUID_IDOL_OF_FERAL_SHADOWS, EFFECT_0)) +                        amount += cp * idol->GetAmount(); +                    // Idol of Worship. Can't be handled as SpellMod due its dependency from CPs +                    else if (AuraEffect const* idol = caster->GetAuraEffect(SPELL_DRUID_IDOL_OF_WORSHIP, EFFECT_0)) +                        amount += cp * idol->GetAmount(); + +                    amount += int32(CalculatePct(caster->GetTotalAttackPowerValue(BASE_ATTACK), cp)); +                } +            } + +            void Register() +            { +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dru_rip_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); +            } +        }; + +        AuraScript* GetAuraScript() const +        { +            return new spell_dru_rip_AuraScript(); +        } +}; +  // 62606 - Savage Defense  class spell_dru_savage_defense : public SpellScriptLoader  { @@ -658,6 +828,35 @@ class spell_dru_tiger_s_fury : public SpellScriptLoader          }  }; +// -61391 - Typhoon +class spell_dru_typhoon : public SpellScriptLoader +{ +    public: +        spell_dru_typhoon() : SpellScriptLoader("spell_dru_typhoon") { } + +        class spell_dru_typhoon_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_dru_typhoon_SpellScript); + +            void HandleKnockBack(SpellEffIndex effIndex) +            { +                // Glyph of Typhoon +                if (GetCaster()->HasAura(SPELL_DRUID_GLYPH_OF_TYPHOON)) +                    PreventHitDefaultEffect(effIndex); +            } + +            void Register() +            { +                OnEffectHitTarget += SpellEffectFn(spell_dru_typhoon_SpellScript::HandleKnockBack, EFFECT_0, SPELL_EFFECT_KNOCK_BACK); +            } +        }; + +        SpellScript* GetSpellScript() const +        { +            return new spell_dru_typhoon_SpellScript(); +        } +}; +  // 70691 - Item T10 Restoration 4P Bonus  class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader  { @@ -715,13 +914,18 @@ class spell_dru_t10_restoration_4p_bonus : public SpellScriptLoader  void AddSC_druid_spell_scripts()  { +    new spell_dru_dash();      new spell_dru_enrage();      new spell_dru_glyph_of_starfire(); +    new spell_dru_idol_lifebloom(); +    new spell_dru_innervate();      new spell_dru_insect_swarm();      new spell_dru_lifebloom();      new spell_dru_moonkin_form_passive(); +    new spell_dru_owlkin_frenzy();      new spell_dru_predatory_strikes();      new spell_dru_primal_tenacity(); +    new spell_dru_rip();      new spell_dru_savage_defense();      new spell_dru_savage_roar();      new spell_dru_starfall_aoe(); @@ -729,5 +933,6 @@ void AddSC_druid_spell_scripts()      new spell_dru_survival_instincts();      new spell_dru_swift_flight_passive();      new spell_dru_tiger_s_fury(); +    new spell_dru_typhoon();      new spell_dru_t10_restoration_4p_bonus();  } diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index b5f4312bae5..6004ec6cf89 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -226,6 +226,158 @@ class spell_gen_cannibalize : public SpellScriptLoader          }  }; +// 63845 - Create Lance +enum CreateLanceSpells +{ +    SPELL_CREATE_LANCE_ALLIANCE = 63914, +    SPELL_CREATE_LANCE_HORDE    = 63919 +}; + +class spell_gen_create_lance : public SpellScriptLoader +{ +    public: +        spell_gen_create_lance() : SpellScriptLoader("spell_gen_create_lance") { } + +        class spell_gen_create_lance_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_gen_create_lance_SpellScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_CREATE_LANCE_ALLIANCE) || !sSpellMgr->GetSpellInfo(SPELL_CREATE_LANCE_HORDE)) +                    return false; +                return true; +            } + +            void HandleScript(SpellEffIndex effIndex) +            { +                PreventHitDefaultEffect(effIndex); + +                if (Player* target = GetHitPlayer()) +                { +                    if (target->GetTeam() == ALLIANCE) +                        GetCaster()->CastSpell(target, SPELL_CREATE_LANCE_ALLIANCE, true); +                    else +                        GetCaster()->CastSpell(target, SPELL_CREATE_LANCE_HORDE, true); +                } +            } + +            void Register() +            { +                OnEffectHitTarget += SpellEffectFn(spell_gen_create_lance_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); +            } +        }; + +        SpellScript* GetSpellScript() const +        { +            return new spell_gen_create_lance_SpellScript(); +        } +}; + +// 28702 - Netherbloom +enum Netherbloom +{ +    SPELL_NETHERBLOOM_POLLEN_1 = 28703 +}; + +class spell_gen_netherbloom : public SpellScriptLoader +{ +    public: +        spell_gen_netherbloom() : SpellScriptLoader("spell_gen_netherbloom") { } + +        class spell_gen_netherbloom_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_gen_netherbloom_SpellScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) +            { +                for (uint8 i = 0; i < 5; ++i) +                    if (!sSpellMgr->GetSpellInfo(SPELL_NETHERBLOOM_POLLEN_1 + i)) +                        return false; +                return true; +            } + +            void HandleScript(SpellEffIndex effIndex) +            { +                PreventHitDefaultEffect(effIndex); + +                if (Unit* target = GetHitUnit()) +                { +                    // 25% chance of casting a random buff +                    if (roll_chance_i(75)) +                        return; + +                    // triggered spells are 28703 to 28707 +                    // Note: some sources say, that there was the possibility of +                    //       receiving a debuff. However, this seems to be removed by a patch. + +                    // don't overwrite an existing aura +                    for (uint8 i = 0; i < 5; ++i) +                        if (target->HasAura(SPELL_NETHERBLOOM_POLLEN_1 + i)) +                            return; + +                    target->CastSpell(target, SPELL_NETHERBLOOM_POLLEN_1 + urand(0, 4), true); +                } +            } + +            void Register() +            { +                OnEffectHitTarget += SpellEffectFn(spell_gen_netherbloom_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); +            } +        }; + +        SpellScript* GetSpellScript() const +        { +            return new spell_gen_netherbloom_SpellScript(); +        } +}; + +// 28720 - Nightmare Vine +enum NightmareVine +{ +    SPELL_NIGHTMARE_POLLEN  = 28721 +}; + +class spell_gen_nightmare_vine : public SpellScriptLoader +{ +    public: +        spell_gen_nightmare_vine() : SpellScriptLoader("spell_gen_nightmare_vine") { } + +        class spell_gen_nightmare_vine_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_gen_nightmare_vine_SpellScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_NIGHTMARE_POLLEN)) +                    return false; +                return true; +            } + +            void HandleScript(SpellEffIndex effIndex) +            { +                PreventHitDefaultEffect(effIndex); + +                if (Unit* target = GetHitUnit()) +                { +                    // 25% chance of casting Nightmare Pollen +                    if (roll_chance_i(25)) +                        target->CastSpell(target, SPELL_NIGHTMARE_POLLEN, true); +                } +            } + +            void Register() +            { +                OnEffectHitTarget += SpellEffectFn(spell_gen_nightmare_vine_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); +            } +        }; + +        SpellScript* GetSpellScript() const +        { +            return new spell_gen_nightmare_vine_SpellScript(); +        } +}; +  // 45472 Parachute  enum ParachuteSpells  { @@ -3195,6 +3347,9 @@ void AddSC_generic_spell_scripts()      new spell_gen_av_drekthar_presence();      new spell_gen_burn_brutallus();      new spell_gen_cannibalize(); +    new spell_gen_create_lance(); +    new spell_gen_netherbloom(); +    new spell_gen_nightmare_vine();      new spell_gen_parachute();      new spell_gen_pet_summoned();      new spell_gen_remove_flight_auras(); diff --git a/src/server/scripts/Spells/spell_holiday.cpp b/src/server/scripts/Spells/spell_holiday.cpp index d883b4d7da7..dbfc2b44501 100644 --- a/src/server/scripts/Spells/spell_holiday.cpp +++ b/src/server/scripts/Spells/spell_holiday.cpp @@ -303,27 +303,10 @@ class spell_winter_veil_mistletoe : public SpellScriptLoader              void HandleScript(SpellEffIndex /*effIndex*/)              { -                Unit* caster = GetCaster(); -                  if (Player* target = GetHitPlayer())                  { -                    uint32 spellId = 0; -                    switch (urand(0, 2)) -                    { -                        case 0: -                            spellId = SPELL_CREATE_MISTLETOE; -                            break; -                        case 1: -                            spellId = SPELL_CREATE_HOLLY; -                            break; -                        case 2: -                            spellId = SPELL_CREATE_SNOWFLAKES; -                            break; -                        default: -                            return; -                    } - -                    caster->CastSpell(target, spellId, true); +                    uint32 spellId = RAND(SPELL_CREATE_HOLLY, SPELL_CREATE_MISTLETOE, SPELL_CREATE_SNOWFLAKES); +                    GetCaster()->CastSpell(target, spellId, true);                  }              } @@ -339,6 +322,71 @@ class spell_winter_veil_mistletoe : public SpellScriptLoader          }  }; +// 26275 - PX-238 Winter Wondervolt TRAP +enum PX238WinterWondervolt +{ +    SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_1  = 26157, +    SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_2  = 26272, +    SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_3  = 26273, +    SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_4  = 26274 +}; + +class spell_winter_veil_px_238_winter_wondervolt : public SpellScriptLoader +{ +    public: +        spell_winter_veil_px_238_winter_wondervolt() : SpellScriptLoader("spell_winter_veil_px_238_winter_wondervolt") { } + +        class spell_winter_veil_px_238_winter_wondervolt_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_winter_veil_px_238_winter_wondervolt_SpellScript); + +            bool Validate(SpellInfo const* /*spellInfo*/) +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_1) || +                    !sSpellMgr->GetSpellInfo(SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_2) || +                    !sSpellMgr->GetSpellInfo(SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_3) || +                    !sSpellMgr->GetSpellInfo(SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_4)) +                    return false; +                return true; +            } + +            void HandleScript(SpellEffIndex effIndex) +            { +                PreventHitDefaultEffect(effIndex); + +                uint32 const spells[4] = +                { +                    SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_1, +                    SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_2, +                    SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_3, +                    SPELL_PX_238_WINTER_WONDERVOLT_TRANSFORM_4 +                }; + +                if (Unit* target = GetHitUnit()) +                { +                    for (uint8 i = 0; i < 4; ++i) +                        if (target->HasAura(spells[i])) +                            return; + +                    GetCaster()->CastSpell(target, spells[urand(0, 3)], true); +                } +            } + +            void Register() +            { +                OnEffectHitTarget += SpellEffectFn(spell_winter_veil_px_238_winter_wondervolt_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); +            } + +        private: + +        }; + +        SpellScript* GetSpellScript() const +        { +            return new spell_winter_veil_px_238_winter_wondervolt_SpellScript(); +        } +}; +  void AddSC_holiday_spell_scripts()  {      // Love is in the Air @@ -349,4 +397,5 @@ void AddSC_holiday_spell_scripts()      new spell_hallow_end_tricky_treat();      // Winter Veil      new spell_winter_veil_mistletoe(); +    new spell_winter_veil_px_238_winter_wondervolt();  } diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index b4e06cb6b48..c38d05bc02a 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -73,6 +73,93 @@ class spell_item_trigger_spell : public SpellScriptLoader          }  }; +// 26400 - Arcane Shroud +class spell_item_arcane_shroud : public SpellScriptLoader +{ +    public: +        spell_item_arcane_shroud() : SpellScriptLoader("spell_item_arcane_shroud") { } + +        class spell_item_arcane_shroud_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_item_arcane_shroud_AuraScript); + +            void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) +            { +                int32 diff = GetUnitOwner()->getLevel() - 60; +                if (diff > 0) +                    amount += 2 * diff; +            } + +            void Register() +            { +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_item_arcane_shroud_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_THREAT); +            } +        }; + +        AuraScript* GetAuraScript() const +        { +            return new spell_item_arcane_shroud_AuraScript(); +        } +}; + +// 8342  - Defibrillate (Goblin Jumper Cables) have 33% chance on success +// 22999 - Defibrillate (Goblin Jumper Cables XL) have 50% chance on success +// 54732 - Defibrillate (Gnomish Army Knife) have 67% chance on success +enum Defibrillate +{ +    SPELL_GOBLIN_JUMPER_CABLES_FAIL     = 8338, +    SPELL_GOBLIN_JUMPER_CABLES_XL_FAIL  = 23055 +}; + +class spell_item_defibrillate : public SpellScriptLoader +{ +    public: +        spell_item_defibrillate(char const* name, uint8 chance, uint32 failSpell = 0) : SpellScriptLoader(name), _chance(chance), _failSpell(failSpell) { } + +        class spell_item_defibrillate_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_item_defibrillate_SpellScript); + +        public: +            spell_item_defibrillate_SpellScript(uint8 chance, uint32 failSpell) : SpellScript(), _chance(chance), _failSpell(failSpell) { } + +            bool Validate(SpellInfo const* /*spellInfo*/) +            { +                if (_failSpell && !sSpellMgr->GetSpellInfo(_failSpell)) +                    return false; +                return true; +            } + +            void HandleScript(SpellEffIndex effIndex) +            { +                if (roll_chance_i(_chance)) +                { +                    PreventHitDefaultEffect(effIndex); +                    if (_failSpell) +                        GetCaster()->CastSpell(GetCaster(), _failSpell, true, GetCastItem()); +                } +            } + +            void Register() +            { +                OnEffectHitTarget += SpellEffectFn(spell_item_defibrillate_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_RESURRECT); +            } + +        private: +            uint8 _chance; +            uint32 _failSpell; +        }; + +        SpellScript* GetSpellScript() const +        { +            return new spell_item_defibrillate_SpellScript(_chance, _failSpell); +        } + +    private: +        uint8 _chance; +        uint32 _failSpell; +}; +  // http://www.wowhead.com/item=6522 Deviate Fish  // 8063 Deviate Fish  enum DeviateFishSpells @@ -464,6 +551,35 @@ class spell_item_noggenfogger_elixir : public SpellScriptLoader          }  }; +// 17512 - Piccolo of the Flaming Fire +class spell_item_piccolo_of_the_flaming_fire : public SpellScriptLoader +{ +    public: +        spell_item_piccolo_of_the_flaming_fire() : SpellScriptLoader("spell_item_piccolo_of_the_flaming_fire") { } + +        class spell_item_piccolo_of_the_flaming_fire_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_item_piccolo_of_the_flaming_fire_SpellScript); + +            void HandleScript(SpellEffIndex effIndex) +            { +                PreventHitDefaultEffect(effIndex); +                if (Player* target = GetHitPlayer()) +                    target->HandleEmoteCommand(EMOTE_STATE_DANCE); +            } + +            void Register() +            { +                OnEffectHitTarget += SpellEffectFn(spell_item_piccolo_of_the_flaming_fire_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); +            } +        }; + +        SpellScript* GetSpellScript() const +        { +            return new spell_item_piccolo_of_the_flaming_fire_SpellScript(); +        } +}; +  // http://www.wowhead.com/item=6657 Savory Deviate Delight  // 8213 Savory Deviate Delight  enum SavoryDeviateDelight @@ -522,6 +638,79 @@ class spell_item_savory_deviate_delight : public SpellScriptLoader          }  }; +// 48129 - Scroll of Recall +// 60320 - Scroll of Recall II +// 60321 - Scroll of Recall III +enum ScrollOfRecall +{ +    SPELL_SCROLL_OF_RECALL_I                = 48129, +    SPELL_SCROLL_OF_RECALL_II               = 60320, +    SPELL_SCROLL_OF_RECALL_III              = 60321, +    SPELL_LOST                              = 60444, +    SPELL_SCROLL_OF_RECALL_FAIL_ALLIANCE_1  = 60323, +    SPELL_SCROLL_OF_RECALL_FAIL_HORDE_1     = 60328, +}; + +class spell_item_scroll_of_recall : public SpellScriptLoader +{ +    public: +        spell_item_scroll_of_recall() : SpellScriptLoader("spell_item_scroll_of_recall") { } + +        class spell_item_scroll_of_recall_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_item_scroll_of_recall_SpellScript); + +            bool Load() +            { +                return GetCaster()->GetTypeId() == TYPEID_PLAYER; +            } + +            void HandleScript(SpellEffIndex effIndex) +            { +                Unit* caster = GetCaster(); +                uint8 maxSafeLevel = 0; +                switch (GetSpellInfo()->Id) +                { +                    case SPELL_SCROLL_OF_RECALL_I:  // Scroll of Recall +                        maxSafeLevel = 40; +                        break; +                    case SPELL_SCROLL_OF_RECALL_II:  // Scroll of Recall II +                        maxSafeLevel = 70; +                        break; +                    case SPELL_SCROLL_OF_RECALL_III:  // Scroll of Recal III +                        maxSafeLevel = 80; +                        break; +                    default: +                        break; +                } + +                if (caster->getLevel() > maxSafeLevel) +                { +                    caster->CastSpell(caster, SPELL_LOST, true); + +                    // ALLIANCE from 60323 to 60330 - HORDE from 60328 to 60335 +                    uint32 spellId = SPELL_SCROLL_OF_RECALL_FAIL_ALLIANCE_1; +                    if (GetCaster()->ToPlayer()->GetTeam() == HORDE) +                        spellId = SPELL_SCROLL_OF_RECALL_FAIL_HORDE_1; + +                    GetCaster()->CastSpell(GetCaster(), spellId + urand(0, 7), true); + +                    PreventHitDefaultEffect(effIndex); +                } +            } + +            void Register() +            { +                OnEffectHitTarget += SpellEffectFn(spell_item_scroll_of_recall_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_TELEPORT_UNITS); +            } +        }; + +        SpellScript* GetSpellScript() const +        { +            return new spell_item_scroll_of_recall_SpellScript(); +        } +}; +  // http://www.wowhead.com/item=7734 Six Demon Bag  // 14537 Six Demon Bag  enum SixDemonBagSpells @@ -593,6 +782,35 @@ class spell_item_six_demon_bag : public SpellScriptLoader          }  }; +// 28862 - The Eye of Diminution +class spell_item_the_eye_of_diminution : public SpellScriptLoader +{ +    public: +        spell_item_the_eye_of_diminution() : SpellScriptLoader("spell_item_the_eye_of_diminution") { } + +        class spell_item_the_eye_of_diminution_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_item_the_eye_of_diminution_AuraScript); + +            void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) +            { +                int32 diff = GetUnitOwner()->getLevel() - 60; +                if (diff > 0) +                    amount += diff; +            } + +            void Register() +            { +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_item_the_eye_of_diminution_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MOD_THREAT); +            } +        }; + +        AuraScript* GetAuraScript() const +        { +            return new spell_item_the_eye_of_diminution_AuraScript(); +        } +}; +  // http://www.wowhead.com/item=44012 Underbelly Elixir  // 59640 Underbelly Elixir  enum UnderbellyElixirSpells @@ -2030,6 +2248,10 @@ void AddSC_item_spell_scripts()      // 23075 Mithril Mechanical Dragonling      new spell_item_trigger_spell("spell_item_mithril_mechanical_dragonling", SPELL_MITHRIL_MECHANICAL_DRAGONLING); +    new spell_item_arcane_shroud(); +    new spell_item_defibrillate("spell_item_goblin_jumper_cables", 67, SPELL_GOBLIN_JUMPER_CABLES_FAIL); +    new spell_item_defibrillate("spell_item_goblin_jumper_cables_xl", 50, SPELL_GOBLIN_JUMPER_CABLES_XL_FAIL); +    new spell_item_defibrillate("spell_item_gnomish_army_knife", 33);      new spell_item_deviate_fish();      new spell_item_flask_of_the_north();      new spell_item_gnomish_death_ray(); @@ -2037,8 +2259,11 @@ void AddSC_item_spell_scripts()      new spell_item_mingos_fortune_generator();      new spell_item_net_o_matic();      new spell_item_noggenfogger_elixir(); +    new spell_item_piccolo_of_the_flaming_fire();      new spell_item_savory_deviate_delight(); +    new spell_item_scroll_of_recall();      new spell_item_six_demon_bag(); +    new spell_item_the_eye_of_diminution();      new spell_item_underbelly_elixir();      new spell_item_shadowmourne();      new spell_item_red_rider_air_rifle(); diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index 61f0579190f..a673759a49e 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -29,7 +29,7 @@  enum MageSpells  {      SPELL_MAGE_COLD_SNAP                         = 11958, -    SPELL_MAGE_FROST_WARDING_R1                  = 28332, +    SPELL_MAGE_FROST_WARDING_R1                  = 11189,      SPELL_MAGE_FROST_WARDING_TRIGGERED           = 57776,      SPELL_MAGE_INCANTERS_ABSORBTION_R1           = 44394,      SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED    = 44413, @@ -45,6 +45,31 @@ enum MageSpells      SPELL_MAGE_GLYPH_OF_BLAST_WAVE               = 62126,  }; +// Incanter's Absorbtion +class spell_mage_incanters_absorbtion_base_AuraScript : public AuraScript +{ +    public: +        bool Validate(SpellInfo const* /*spellInfo*/) +        { +            if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED)) +                return false; +            if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_INCANTERS_ABSORBTION_R1)) +                return false; +            return true; +        } + +        void Trigger(AuraEffect* aurEff, DamageInfo& /*dmgInfo*/, uint32& absorbAmount) +        { +            Unit* target = GetTarget(); + +            if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_MAGE_INCANTERS_ABSORBTION_R1, EFFECT_0)) +            { +                int32 bp = CalculatePct(absorbAmount, talentAurEff->GetAmount()); +                target->CastCustomSpell(target, SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff); +            } +        } +}; +  // -11113 - Blast Wave  class spell_mage_blast_wave : public SpellScriptLoader  { @@ -127,29 +152,47 @@ class spell_mage_cold_snap : public SpellScriptLoader          }  }; -// -543, -6143 - Frost Warding -class spell_mage_frost_warding_trigger : public SpellScriptLoader +// -543  - Fire Ward +// -6143 - Frost Ward +class spell_mage_fire_frost_ward : public SpellScriptLoader  {      public: -        spell_mage_frost_warding_trigger() : SpellScriptLoader("spell_mage_frost_warding_trigger") { } +        spell_mage_fire_frost_ward() : SpellScriptLoader("spell_mage_fire_frost_ward") { } -        class spell_mage_frost_warding_trigger_AuraScript : public AuraScript +        class spell_mage_fire_frost_ward_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript          { -            PrepareAuraScript(spell_mage_frost_warding_trigger_AuraScript); +            PrepareAuraScript(spell_mage_fire_frost_ward_AuraScript);              bool Validate(SpellInfo const* /*spellInfo*/)              { -                if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_TRIGGERED) || !sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_R1)) +                if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_TRIGGERED)) +                    return false; +                if (!sSpellMgr->GetSpellInfo(SPELL_MAGE_FROST_WARDING_R1))                      return false;                  return true;              } -            void Absorb(AuraEffect* aurEff, DamageInfo & dmgInfo, uint32 & absorbAmount) +            void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) +            { +                canBeRecalculated = false; +                if (Unit* caster = GetCaster()) +                { +                    // +80.68% from sp bonus +                    float bonus = 0.8068f; + +                    bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()); +                    bonus *= caster->CalculateLevelPenalty(GetSpellInfo()); + +                    amount += int32(bonus); +                } +            } + +            void Absorb(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount)              {                  Unit* target = GetTarget();                  if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_MAGE_FROST_WARDING_R1, EFFECT_0))                  { -                    int32 chance = talentAurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue(); +                    int32 chance = talentAurEff->GetSpellInfo()->Effects[EFFECT_1].CalcValue(); // SPELL_EFFECT_DUMMY with NO_TARGET                      if (roll_chance_i(chance))                      { @@ -164,79 +207,58 @@ class spell_mage_frost_warding_trigger : public SpellScriptLoader              void Register()              { -                 OnEffectAbsorb += AuraEffectAbsorbFn(spell_mage_frost_warding_trigger_AuraScript::Absorb, EFFECT_0); +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_fire_frost_ward_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); +                OnEffectAbsorb += AuraEffectAbsorbFn(spell_mage_fire_frost_ward_AuraScript::Absorb, EFFECT_0); +                AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_fire_frost_ward_AuraScript::Trigger, EFFECT_0);              }          };          AuraScript* GetAuraScript() const          { -            return new spell_mage_frost_warding_trigger_AuraScript(); +            return new spell_mage_fire_frost_ward_AuraScript();          }  }; -class spell_mage_incanters_absorbtion_base_AuraScript : public AuraScript +// -11426 - Ice Barrier +class spell_mage_ice_barrier : public SpellScriptLoader  {      public: +        spell_mage_ice_barrier() : SpellScriptLoader("spell_mage_ice_barrier") { } -        bool Validate(SpellInfo const* /*spellInfo*/) -        { -            return sSpellMgr->GetSpellInfo(SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED) -                && sSpellMgr->GetSpellInfo(SPELL_MAGE_INCANTERS_ABSORBTION_R1); -        } - -        void Trigger(AuraEffect* aurEff, DamageInfo & /*dmgInfo*/, uint32 & absorbAmount) +        class spell_mage_ice_barrier_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript          { -            Unit* target = GetTarget(); +            PrepareAuraScript(spell_mage_ice_barrier_AuraScript); -            if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_MAGE_INCANTERS_ABSORBTION_R1, EFFECT_0)) +            void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated)              { -                int32 bp = CalculatePct(absorbAmount, talentAurEff->GetAmount()); -                target->CastCustomSpell(target, SPELL_MAGE_INCANTERS_ABSORBTION_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff); -            } -        } -}; - -// -543, -6143, -11426 - Incanter's Absorption -class spell_mage_incanters_absorbtion_absorb : public SpellScriptLoader -{ -    public: -        spell_mage_incanters_absorbtion_absorb() : SpellScriptLoader("spell_mage_incanters_absorbtion_absorb") { } +                canBeRecalculated = false; +                if (Unit* caster = GetCaster()) +                { +                    // +80.68% from sp bonus +                    float bonus = 0.8068f; -        class spell_mage_incanters_absorbtion_absorb_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript -        { -            PrepareAuraScript(spell_mage_incanters_absorbtion_absorb_AuraScript); +                    bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()); -            void Register() -            { -                 AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_incanters_absorbtion_absorb_AuraScript::Trigger, EFFECT_0); -            } -        }; +                    // Glyph of Ice Barrier: its weird having a SPELLMOD_ALL_EFFECTS here but its blizzards doing :) +                    // Glyph of Ice Barrier is only applied at the spell damage bonus because it was already applied to the base value in CalculateSpellDamage +                    bonus = caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), bonus); -        AuraScript* GetAuraScript() const -        { -            return new spell_mage_incanters_absorbtion_absorb_AuraScript(); -        } -}; +                    bonus *= caster->CalculateLevelPenalty(GetSpellInfo()); -// -1463 - Incanter's Absorption -class spell_mage_incanters_absorbtion_manashield : public SpellScriptLoader -{ -    public: -        spell_mage_incanters_absorbtion_manashield() : SpellScriptLoader("spell_mage_incanters_absorbtion_manashield") { } - -        class spell_mage_incanters_absorbtion_manashield_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript -        { -            PrepareAuraScript(spell_mage_incanters_absorbtion_manashield_AuraScript); +                    amount += int32(bonus); +                } +            }              void Register()              { -                 AfterEffectManaShield += AuraEffectManaShieldFn(spell_mage_incanters_absorbtion_manashield_AuraScript::Trigger, EFFECT_0); +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_ice_barrier_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); +                AfterEffectAbsorb += AuraEffectAbsorbFn(spell_mage_ice_barrier_AuraScript::Trigger, EFFECT_0);              }          };          AuraScript* GetAuraScript() const          { -            return new spell_mage_incanters_absorbtion_manashield_AuraScript(); +            return new spell_mage_ice_barrier_AuraScript();          }  }; @@ -279,6 +301,44 @@ class spell_mage_living_bomb : public SpellScriptLoader          }  }; +// -1463 - Mana Shield +class spell_mage_mana_shield : public SpellScriptLoader +{ +    public: +        spell_mage_mana_shield() : SpellScriptLoader("spell_mage_mana_shield") { } + +        class spell_mage_mana_shield_AuraScript : public spell_mage_incanters_absorbtion_base_AuraScript +        { +            PrepareAuraScript(spell_mage_mana_shield_AuraScript); + +            void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) +            { +                canBeRecalculated = false; +                if (Unit* caster = GetCaster()) +                { +                    // +80.53% from sp bonus +                    float bonus = 0.8053f; + +                    bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()); +                    bonus *= caster->CalculateLevelPenalty(GetSpellInfo()); + +                    amount += int32(bonus); +                } +            } + +            void Register() +            { +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_mana_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_MANA_SHIELD); +                AfterEffectManaShield += AuraEffectManaShieldFn(spell_mage_mana_shield_AuraScript::Trigger, EFFECT_0); +            } +        }; + +        AuraScript* GetAuraScript() const +        { +            return new spell_mage_mana_shield_AuraScript(); +        } +}; +  enum SilvermoonPolymorph  {      NPC_AUROSALIA   = 18744, @@ -378,10 +438,10 @@ void AddSC_mage_spell_scripts()  {      new spell_mage_blast_wave();      new spell_mage_cold_snap(); -    new spell_mage_frost_warding_trigger(); -    new spell_mage_incanters_absorbtion_absorb(); -    new spell_mage_incanters_absorbtion_manashield(); +    new spell_mage_fire_frost_ward(); +    new spell_mage_ice_barrier();      new spell_mage_living_bomb(); +    new spell_mage_mana_shield();      new spell_mage_polymorph_cast_visual();      new spell_mage_summon_water_elemental();  } diff --git a/src/server/scripts/Spells/spell_paladin.cpp b/src/server/scripts/Spells/spell_paladin.cpp index d3fc86302e1..2f22de97d77 100644 --- a/src/server/scripts/Spells/spell_paladin.cpp +++ b/src/server/scripts/Spells/spell_paladin.cpp @@ -51,6 +51,13 @@ enum PaladinSpells      SPELL_PALADIN_HAND_OF_SACRIFICE              = 6940,      SPELL_PALADIN_DIVINE_SACRIFICE               = 64205, + +    SPELL_PALADIN_GLYPH_OF_SALVATION             = 63225, + +    SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT        = 31790, + +    SPELL_GENERIC_ARENA_DAMPENING                = 74410, +    SPELL_GENERIC_BATTLEGROUND_DAMPENING         = 74411  };  // 31850 - Ardent Defender @@ -490,6 +497,39 @@ class spell_pal_hand_of_sacrifice : public SpellScriptLoader          }  }; +// 1038 - Hand of Salvation +class spell_pal_hand_of_salvation : public SpellScriptLoader +{ +    public: +        spell_pal_hand_of_salvation() : SpellScriptLoader("spell_pal_hand_of_salvation") { } + +        class spell_pal_hand_of_salvation_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_pal_hand_of_salvation_AuraScript); + +            void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) +            { +                if (Unit* caster = GetCaster()) +                { +                    // Glyph of Salvation +                    if (caster->GetGUID() == GetUnitOwner()->GetGUID()) +                        if (AuraEffect const* aurEff = caster->GetAuraEffect(SPELL_PALADIN_GLYPH_OF_SALVATION, EFFECT_0)) +                            amount -= aurEff->GetAmount(); +                } +            } + +            void Register() +            { +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pal_hand_of_salvation_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN); +            } +        }; + +        AuraScript* GetAuraScript() const +        { +            return new spell_pal_hand_of_salvation_AuraScript(); +        } +}; +  // -20473 - Holy Shock  class spell_pal_holy_shock : public SpellScriptLoader  { @@ -656,6 +696,13 @@ class spell_pal_righteous_defense : public SpellScriptLoader          {              PrepareSpellScript(spell_pal_righteous_defense_SpellScript); +            bool Validate(SpellInfo const* /*spellInfo*/) +            { +                if (!sSpellMgr->GetSpellInfo(SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT)) +                    return false; +                return true; +            } +              SpellCastResult CheckCast()              {                  Unit* caster = GetCaster(); @@ -673,9 +720,27 @@ class spell_pal_righteous_defense : public SpellScriptLoader                  return SPELL_CAST_OK;              } +            void HandleTriggerSpellLaunch(SpellEffIndex effIndex) +            { +                PreventHitDefaultEffect(effIndex); +            } + +            void HandleTriggerSpellHit(SpellEffIndex effIndex) +            { +                PreventHitDefaultEffect(effIndex); +                if (Unit* target = GetHitUnit()) +                    GetCaster()->CastSpell(target, SPELL_PALADIN_RIGHTEOUS_DEFENSE_TAUNT, true); +            } +              void Register()              {                  OnCheckCast += SpellCheckCastFn(spell_pal_righteous_defense_SpellScript::CheckCast); +                //! WORKAROUND +                //! target select will be executed in hitphase of effect 0 +                //! so we must handle trigger spell also in hit phase (default execution in launch phase) +                //! see issue #3718 +                OnEffectLaunchTarget += SpellEffectFn(spell_pal_righteous_defense_SpellScript::HandleTriggerSpellLaunch, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL); +                OnEffectHitTarget += SpellEffectFn(spell_pal_righteous_defense_SpellScript::HandleTriggerSpellHit, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL);              }          }; @@ -685,6 +750,50 @@ class spell_pal_righteous_defense : public SpellScriptLoader          }  }; +// 58597 - Sacred Shield +class spell_pal_sacred_shield : public SpellScriptLoader +{ +    public: +        spell_pal_sacred_shield() : SpellScriptLoader("spell_pal_sacred_shield") { } + +        class spell_pal_sacred_shield_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_pal_sacred_shield_AuraScript); + +            void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& /*canBeRecalculated*/) +            { +                if (Unit* caster = GetCaster()) +                { +                    // +75.00% from sp bonus +                    float bonus = CalculatePct(caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()), 75.0f); + +                    // Divine Guardian is only applied at the spell healing bonus because it was already applied to the base value in CalculateSpellDamage +                    bonus = caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), bonus); +                    bonus *= caster->CalculateLevelPenalty(GetSpellInfo()); + +                    amount += int32(bonus); + +                    // Arena - Dampening +                    if (AuraEffect const* dampening = caster->GetAuraEffect(SPELL_GENERIC_ARENA_DAMPENING, EFFECT_0)) +                        AddPct(amount, dampening->GetAmount()); +                    // Battleground - Dampening +                    else if (AuraEffect const* dampening = caster->GetAuraEffect(SPELL_GENERIC_BATTLEGROUND_DAMPENING, EFFECT_0)) +                        AddPct(amount, dampening->GetAmount()); +                } +            } + +            void Register() +            { +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pal_sacred_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); +            } +        }; + +        AuraScript* GetAuraScript() const +        { +            return new spell_pal_sacred_shield_AuraScript(); +        } +}; +  void AddSC_paladin_spell_scripts()  {      new spell_pal_ardent_defender(); @@ -696,8 +805,10 @@ void AddSC_paladin_spell_scripts()      new spell_pal_exorcism_and_holy_wrath_damage();      new spell_pal_guarded_by_the_light();      new spell_pal_hand_of_sacrifice(); +    new spell_pal_hand_of_salvation();      new spell_pal_holy_shock();      new spell_pal_judgement_of_command();      new spell_pal_lay_on_hands();      new spell_pal_righteous_defense(); +    new spell_pal_sacred_shield();  } diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index 1c416a0d28a..23a39819aa2 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -30,6 +30,7 @@  enum PriestSpells  {      SPELL_PRIEST_EMPOWERED_RENEW                = 63544, +    SPELL_PRIEST_GLYPHE_OF_LIGHTWELL            = 55673,      SPELL_PRIEST_GUARDIAN_SPIRIT_HEAL           = 48153,      SPELL_PRIEST_PENANCE_R1                     = 47540,      SPELL_PRIEST_PENANCE_R1_DAMAGE              = 47758, @@ -43,6 +44,7 @@ enum PriestSpells  enum PriestSpellIcons  { +    PRIEST_ICON_ID_BORROWED_TIME                = 2899,      PRIEST_ICON_ID_EMPOWERED_RENEW_TALENT       = 3021,      PRIEST_ICON_ID_PAIN_AND_SUFFERING           = 2874,  }; @@ -104,6 +106,38 @@ class spell_pri_guardian_spirit : public SpellScriptLoader          }  }; +// -7001 - Lightwell Renew +class spell_pri_lightwell_renew : public SpellScriptLoader +{ +    public: +        spell_pri_lightwell_renew() : SpellScriptLoader("spell_pri_lightwell_renew") { } + +        class spell_pri_lightwell_renew_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_pri_lightwell_renew_AuraScript); + +            void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& /*canBeRecalculated*/) +            { +                if (Unit* caster = GetCaster()) +                { +                    // Bonus from Glyph of Lightwell +                    if (AuraEffect* modHealing = caster->GetAuraEffect(SPELL_PRIEST_GLYPHE_OF_LIGHTWELL, EFFECT_0)) +                        AddPct(amount, modHealing->GetAmount()); +                } +            } + +            void Register() +            { +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_lightwell_renew_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_HEAL); +            } +        }; + +        AuraScript* GetAuraScript() const +        { +            return new spell_pri_lightwell_renew_AuraScript(); +        } +}; +  // -8129 - Mana Burn  class spell_pri_mana_burn : public SpellScriptLoader  { @@ -260,81 +294,114 @@ class spell_pri_penance : public SpellScriptLoader          }  }; -// 33110 - Prayer of Mending Heal -class spell_pri_prayer_of_mending_heal : public SpellScriptLoader +// -17 - Power Word: Shield +class spell_pri_power_word_shield : public SpellScriptLoader  {      public: -        spell_pri_prayer_of_mending_heal() : SpellScriptLoader("spell_pri_prayer_of_mending_heal") { } +        spell_pri_power_word_shield() : SpellScriptLoader("spell_pri_power_word_shield") { } -        class spell_pri_prayer_of_mending_heal_SpellScript : public SpellScript +        class spell_pri_power_word_shield_AuraScript : public AuraScript          { -            PrepareSpellScript(spell_pri_prayer_of_mending_heal_SpellScript); +            PrepareAuraScript(spell_pri_power_word_shield_AuraScript); -            void HandleHeal(SpellEffIndex /*effIndex*/) +            bool Validate(SpellInfo const* /*spellInfo*/)              { -                if (Unit* caster = GetOriginalCaster()) +                if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED)) +                    return false; +                if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_REFLECTIVE_SHIELD_R1)) +                    return false; +                return true; +            } + +            void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated) +            { +                canBeRecalculated = false; +                if (Unit* caster = GetCaster())                  { -                    if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_PRIEST_T9_HEALING_2P, EFFECT_0)) +                    // +80.68% from sp bonus +                    float bonus = 0.8068f; + +                    // Borrowed Time +                    if (AuraEffect const* borrowedTime = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, PRIEST_ICON_ID_BORROWED_TIME, EFFECT_1)) +                        bonus += CalculatePct(1.0f, borrowedTime->GetAmount()); + +                    bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()); + +                    // Improved PW: Shield: its weird having a SPELLMOD_ALL_EFFECTS here but its blizzards doing :) +                    // Improved PW: Shield is only applied at the spell healing bonus because it was already applied to the base value in CalculateSpellDamage +                    bonus = caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), bonus); +                    bonus *= caster->CalculateLevelPenalty(GetSpellInfo()); + +                    amount += int32(bonus); + +                    // Twin Disciplines +                    if (AuraEffect const* twinDisciplines = caster->GetAuraEffect(SPELL_AURA_ADD_PCT_MODIFIER, SPELLFAMILY_PRIEST, 0x400000, 0, 0, GetCasterGUID())) +                        AddPct(amount, twinDisciplines->GetAmount()); + +                    // Focused Power +                    amount *= caster->GetTotalAuraMultiplier(SPELL_AURA_MOD_HEALING_DONE_PERCENT); +                } +            } + +            void ReflectDamage(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount) +            { +                Unit* target = GetTarget(); +                if (dmgInfo.GetAttacker() == target) +                    return; + +                if (Unit* caster = GetCaster()) +                    if (AuraEffect* talentAurEff = caster->GetAuraEffectOfRankedSpell(SPELL_PRIEST_REFLECTIVE_SHIELD_R1, EFFECT_0))                      { -                        int32 heal = GetHitHeal(); -                        AddPct(heal, aurEff->GetAmount()); -                        SetHitHeal(heal); +                        int32 bp = CalculatePct(absorbAmount, talentAurEff->GetAmount()); +                        target->CastCustomSpell(dmgInfo.GetAttacker(), SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff);                      } -                }              }              void Register()              { -                OnEffectHitTarget += SpellEffectFn(spell_pri_prayer_of_mending_heal_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL); +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_pri_power_word_shield_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); +                AfterEffectAbsorb += AuraEffectAbsorbFn(spell_pri_power_word_shield_AuraScript::ReflectDamage, EFFECT_0);              }          }; -        SpellScript* GetSpellScript() const +        AuraScript* GetAuraScript() const          { -            return new spell_pri_prayer_of_mending_heal_SpellScript(); +            return new spell_pri_power_word_shield_AuraScript();          }  }; -// -17 - Reflective Shield -class spell_pri_reflective_shield_trigger : public SpellScriptLoader +// 33110 - Prayer of Mending Heal +class spell_pri_prayer_of_mending_heal : public SpellScriptLoader  {      public: -        spell_pri_reflective_shield_trigger() : SpellScriptLoader("spell_pri_reflective_shield_trigger") { } +        spell_pri_prayer_of_mending_heal() : SpellScriptLoader("spell_pri_prayer_of_mending_heal") { } -        class spell_pri_reflective_shield_trigger_AuraScript : public AuraScript +        class spell_pri_prayer_of_mending_heal_SpellScript : public SpellScript          { -            PrepareAuraScript(spell_pri_reflective_shield_trigger_AuraScript); - -            bool Validate(SpellInfo const* /*spellInfo*/) -            { -                if (!sSpellMgr->GetSpellInfo(SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED) || !sSpellMgr->GetSpellInfo(SPELL_PRIEST_REFLECTIVE_SHIELD_R1)) -                    return false; -                return true; -            } +            PrepareSpellScript(spell_pri_prayer_of_mending_heal_SpellScript); -            void Trigger(AuraEffect* aurEff, DamageInfo & dmgInfo, uint32 & absorbAmount) +            void HandleHeal(SpellEffIndex /*effIndex*/)              { -                Unit* target = GetTarget(); -                if (dmgInfo.GetAttacker() == target) -                    return; - -                if (GetCaster()) -                    if (AuraEffect* talentAurEff = target->GetAuraEffectOfRankedSpell(SPELL_PRIEST_REFLECTIVE_SHIELD_R1, EFFECT_0)) +                if (Unit* caster = GetOriginalCaster()) +                { +                    if (AuraEffect* aurEff = caster->GetAuraEffect(SPELL_PRIEST_T9_HEALING_2P, EFFECT_0))                      { -                        int32 bp = CalculatePct(absorbAmount, talentAurEff->GetAmount()); -                        target->CastCustomSpell(dmgInfo.GetAttacker(), SPELL_PRIEST_REFLECTIVE_SHIELD_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff); +                        int32 heal = GetHitHeal(); +                        AddPct(heal, aurEff->GetAmount()); +                        SetHitHeal(heal);                      } +                }              }              void Register()              { -                 AfterEffectAbsorb += AuraEffectAbsorbFn(spell_pri_reflective_shield_trigger_AuraScript::Trigger, EFFECT_0); +                OnEffectHitTarget += SpellEffectFn(spell_pri_prayer_of_mending_heal_SpellScript::HandleHeal, EFFECT_0, SPELL_EFFECT_HEAL);              }          }; -        AuraScript* GetAuraScript() const +        SpellScript* GetSpellScript() const          { -            return new spell_pri_reflective_shield_trigger_AuraScript(); +            return new spell_pri_prayer_of_mending_heal_SpellScript();          }  }; @@ -458,12 +525,13 @@ class spell_pri_vampiric_touch : public SpellScriptLoader  void AddSC_priest_spell_scripts()  {      new spell_pri_guardian_spirit(); +    new spell_pri_lightwell_renew();      new spell_pri_mana_burn();      new spell_pri_mind_sear();      new spell_pri_pain_and_suffering_proc();      new spell_pri_penance(); +    new spell_pri_power_word_shield();      new spell_pri_prayer_of_mending_heal(); -    new spell_pri_reflective_shield_trigger();      new spell_pri_renew();      new spell_pri_shadow_word_death();      new spell_pri_vampiric_touch(); diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp index 70b677f5aaa..156158b4e36 100644 --- a/src/server/scripts/Spells/spell_rogue.cpp +++ b/src/server/scripts/Spells/spell_rogue.cpp @@ -347,6 +347,58 @@ class spell_rog_prey_on_the_weak : public SpellScriptLoader          }  }; +// -1943 - Rupture +class spell_rog_rupture : public SpellScriptLoader +{ +    public: +        spell_rog_rupture() : SpellScriptLoader("spell_rog_rupture") { } + +        class spell_rog_rupture_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_rog_rupture_AuraScript); + +            bool Load() +            { +                Unit* caster = GetCaster(); +                return caster && caster->GetTypeId() == TYPEID_PLAYER; +            } + +            void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) +            { +                if (Unit* caster = GetCaster()) +                { +                    canBeRecalculated = false; + +                    float const attackpowerPerCombo[6] = +                    { +                        0.0f, +                        0.015f,         // 1 point:  ${($m1 + $b1*1 + 0.015 * $AP) * 4} damage over 8 secs +                        0.024f,         // 2 points: ${($m1 + $b1*2 + 0.024 * $AP) * 5} damage over 10 secs +                        0.03f,          // 3 points: ${($m1 + $b1*3 + 0.03 * $AP) * 6} damage over 12 secs +                        0.03428571f,    // 4 points: ${($m1 + $b1*4 + 0.03428571 * $AP) * 7} damage over 14 secs +                        0.0375f         // 5 points: ${($m1 + $b1*5 + 0.0375 * $AP) * 8} damage over 16 secs +                    }; + +                    uint8 cp = caster->ToPlayer()->GetComboPoints(); +                    if (cp > 5) +                        cp = 5; + +                    amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * attackpowerPerCombo[cp]); +                } +            } + +            void Register() +            { +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_rog_rupture_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); +            } +        }; + +        AuraScript* GetAuraScript() const +        { +            return new spell_rog_rupture_AuraScript(); +        } +}; +  // 5938 - Shiv  class spell_rog_shiv : public SpellScriptLoader  { @@ -395,5 +447,6 @@ void AddSC_rogue_spell_scripts()      new spell_rog_nerves_of_steel();      new spell_rog_preparation();      new spell_rog_prey_on_the_weak(); +    new spell_rog_rupture();      new spell_rog_shiv();  } diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 0d249953421..2994761be6f 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -38,6 +38,7 @@ enum ShamanSpells      SPELL_SHAMAN_FIRE_NOVA_TRIGGERED_R1         = 8349,      SPELL_SHAMAN_GLYPH_OF_HEALING_STREAM_TOTEM  = 55456,      SPELL_SHAMAN_GLYPH_OF_MANA_TIDE             = 55441, +    SPELL_SHAMAN_GLYPH_OF_THUNDERSTORM          = 62132,      SPELL_SHAMAN_LAVA_FLOWS_R1                  = 51480,      SPELL_SHAMAN_LAVA_FLOWS_TRIGGERED_R1        = 64694,      SPELL_SHAMAN_MANA_SPRING_TOTEM_ENERGIZE     = 52032, @@ -743,6 +744,35 @@ class spell_sha_sentry_totem : public SpellScriptLoader          }  }; +// -51490 - Thunderstorm +class spell_sha_thunderstorm : public SpellScriptLoader +{ +    public: +        spell_sha_thunderstorm() : SpellScriptLoader("spell_sha_thunderstorm") { } + +        class spell_sha_thunderstorm_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_sha_thunderstorm_SpellScript); + +            void HandleKnockBack(SpellEffIndex effIndex) +            { +                // Glyph of Thunderstorm +                if (GetCaster()->HasAura(SPELL_SHAMAN_GLYPH_OF_THUNDERSTORM)) +                    PreventHitDefaultEffect(effIndex); +            } + +            void Register() +            { +                OnEffectHitTarget += SpellEffectFn(spell_sha_thunderstorm_SpellScript::HandleKnockBack, EFFECT_2, SPELL_EFFECT_KNOCK_BACK); +            } +        }; + +        SpellScript* GetSpellScript() const +        { +            return new spell_sha_thunderstorm_SpellScript(); +        } +}; +  void AddSC_shaman_spell_scripts()  {      new spell_sha_ancestral_awakening_proc(); @@ -760,4 +790,5 @@ void AddSC_shaman_spell_scripts()      new spell_sha_mana_spring_totem();      new spell_sha_mana_tide_totem();      new spell_sha_sentry_totem(); +    new spell_sha_thunderstorm();  } diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index 89c69733daf..68ad1315dce 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -649,6 +649,43 @@ class spell_warl_seed_of_corruption : public SpellScriptLoader          }  }; +// -7235 - Shadow Ward +class spell_warl_shadow_ward : public SpellScriptLoader +{ +    public: +        spell_warl_shadow_ward() : SpellScriptLoader("spell_warl_shadow_ward") { } + +        class spell_warl_shadow_ward_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_warl_shadow_ward_AuraScript); + +            void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) +            { +                canBeRecalculated = false; +                if (Unit* caster = GetCaster()) +                { +                    // +80.68% from sp bonus +                    float bonus = 0.8068f; + +                    bonus *= caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()); +                    bonus *= caster->CalculateLevelPenalty(GetSpellInfo()); + +                    amount += int32(bonus); +                } +            } + +            void Register() +            { +                DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warl_shadow_ward_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); +            } +        }; + +        AuraScript* GetAuraScript() const +        { +            return new spell_warl_shadow_ward_AuraScript(); +        } +}; +  // 29858 - Soulshatter  class spell_warl_soulshatter : public SpellScriptLoader  { @@ -742,6 +779,7 @@ void AddSC_warlock_spell_scripts()      new spell_warl_life_tap();      new spell_warl_ritual_of_doom_effect();      new spell_warl_seed_of_corruption(); +    new spell_warl_shadow_ward();      new spell_warl_soulshatter();      new spell_warl_unstable_affliction();  } diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index f84265b89de..822d4b17992 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -41,6 +41,7 @@ enum WarriorSpells      SPELL_WARRIOR_JUGGERNAUT_CRIT_BONUS_TALENT      = 64976,      SPELL_WARRIOR_LAST_STAND_TRIGGERED              = 12976,      SPELL_WARRIOR_SLAM                              = 50783, +    SPELL_WARRIOR_TAUNT                             = 355,      SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_1        = 46859,      SPELL_WARRIOR_UNRELENTING_ASSAULT_RANK_2        = 46860,      SPELL_WARRIOR_UNRELENTING_ASSAULT_TRIGGER_1     = 64849, @@ -333,6 +334,34 @@ class spell_warr_improved_spell_reflection : public SpellScriptLoader          }  }; +// 5246 - Intimidating Shout +class spell_warr_intimidating_shout : public SpellScriptLoader +{ +    public: +        spell_warr_intimidating_shout() : SpellScriptLoader("spell_warr_intimidating_shout") { } + +        class spell_warr_intimidating_shout_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_warr_intimidating_shout_SpellScript); + +            void FilterTargets(std::list<WorldObject*>& unitList) +            { +                unitList.remove(GetExplTargetWorldObject()); +            } + +            void Register() +            { +                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_intimidating_shout_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY); +                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_warr_intimidating_shout_SpellScript::FilterTargets, EFFECT_2, TARGET_UNIT_SRC_AREA_ENEMY); +            } +        }; + +        SpellScript* GetSpellScript() const +        { +            return new spell_warr_intimidating_shout_SpellScript(); +        } +}; +  // 12975 - Last Stand  class spell_warr_last_stand : public SpellScriptLoader  { @@ -409,6 +438,83 @@ class spell_warr_overpower : public SpellScriptLoader          }  }; +// -772 - Rend +class spell_warr_rend : public SpellScriptLoader +{ +    public: +        spell_warr_rend() : SpellScriptLoader("spell_warr_rend") { } + +        class spell_warr_rend_AuraScript : public AuraScript +        { +            PrepareAuraScript(spell_warr_rend_AuraScript); + +            void CalculateAmount(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated) +            { +                if (Unit* caster = GetCaster()) +                { +                    canBeRecalculated = false; + +                    // $0.2 * (($MWB + $mwb) / 2 + $AP / 14 * $MWS) bonus per tick +                    float ap = caster->GetTotalAttackPowerValue(BASE_ATTACK); +                    int32 mws = caster->GetAttackTime(BASE_ATTACK); +                    float mwbMin = caster->GetWeaponDamageRange(BASE_ATTACK, MINDAMAGE); +                    float mwbMax = caster->GetWeaponDamageRange(BASE_ATTACK, MAXDAMAGE); +                    float mwb = ((mwbMin + mwbMax) / 2 + ap * mws / 14000) * 0.2f; +                    amount += int32(caster->ApplyEffectModifiers(GetSpellInfo(), aurEff->GetEffIndex(), mwb)); + +                    // "If used while your target is above 75% health, Rend does 35% more damage." +                    // as for 3.1.3 only ranks above 9 (wrong tooltip?) +                    if (GetSpellInfo()->GetRank() >= 9) +                    { +                        if (GetUnitOwner()->HasAuraState(AURA_STATE_HEALTH_ABOVE_75_PERCENT, GetSpellInfo(), caster)) +                            AddPct(amount, GetSpellInfo()->Effects[EFFECT_2].CalcValue(caster)); +                    } +                } +            } + +            void Register() +            { +                 DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_warr_rend_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); +            } +        }; + +        AuraScript* GetAuraScript() const +        { +            return new spell_warr_rend_AuraScript(); +        } +}; + +// 64380, 65941 - Shattering Throw +class spell_warr_shattering_throw : public SpellScriptLoader +{ +    public: +        spell_warr_shattering_throw() : SpellScriptLoader("spell_warr_shattering_throw") { } + +        class spell_warr_shattering_throw_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_warr_shattering_throw_SpellScript); + +            void HandleScript(SpellEffIndex effIndex) +            { +                PreventHitDefaultEffect(effIndex); + +                // remove shields, will still display immune to damage part +                if (Unit* target = GetHitUnit()) +                    target->RemoveAurasWithMechanic(1 << MECHANIC_IMMUNE_SHIELD, AURA_REMOVE_BY_ENEMY_SPELL); +            } + +            void Register() +            { +                OnEffectHitTarget += SpellEffectFn(spell_warr_shattering_throw_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); +            } +        }; + +        SpellScript* GetSpellScript() const +        { +            return new spell_warr_shattering_throw_SpellScript(); +        } +}; +  // -1464 - Slam  class spell_warr_slam : public SpellScriptLoader  { @@ -493,6 +599,37 @@ class spell_warr_vigilance : public SpellScriptLoader          }  }; +// 50725 Vigilance +class spell_warr_vigilance_trigger : public SpellScriptLoader +{ +    public: +        spell_warr_vigilance_trigger() : SpellScriptLoader("spell_warr_vigilance_trigger") { } + +        class spell_warr_vigilance_trigger_SpellScript : public SpellScript +        { +            PrepareSpellScript(spell_warr_vigilance_trigger_SpellScript); + +            void HandleScript(SpellEffIndex effIndex) +            { +                PreventHitDefaultEffect(effIndex); + +                // Remove Taunt cooldown +                if (Player* target = GetHitPlayer()) +                    target->RemoveSpellCooldown(SPELL_WARRIOR_TAUNT, true); +            } + +            void Register() +            { +                OnEffectHitTarget += SpellEffectFn(spell_warr_vigilance_trigger_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); +            } +        }; + +        SpellScript* GetSpellScript() const +        { +            return new spell_warr_vigilance_trigger_SpellScript(); +        } +}; +  void AddSC_warrior_spell_scripts()  {      new spell_warr_bloodthirst(); @@ -502,8 +639,12 @@ void AddSC_warrior_spell_scripts()      new spell_warr_deep_wounds();      new spell_warr_execute();      new spell_warr_improved_spell_reflection(); +    new spell_warr_intimidating_shout();      new spell_warr_last_stand();      new spell_warr_overpower(); +    new spell_warr_rend(); +    new spell_warr_shattering_throw();      new spell_warr_slam();      new spell_warr_vigilance(); +    new spell_warr_vigilance_trigger();  } | 
