diff options
Diffstat (limited to 'src/server/scripts')
| -rw-r--r-- | src/server/scripts/Spells/spell_mage.cpp | 49 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_priest.cpp | 113 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_rogue.cpp | 172 | 
3 files changed, 291 insertions, 43 deletions
| diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index a1c88a57531..583f76e254e 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -39,23 +39,15 @@ enum MageSpells  class spell_mage_cold_snap_SpellScript : public SpellScript  { -    bool Validate(SpellEntry const * spellEntry) -    { -        return true; -    }; -      void HandleDummy(SpellEffIndex effIndex)      { -        Unit *m_caster = GetCaster(); +        Unit *caster = GetCaster(); -        if (!m_caster) -            return; - -        if (m_caster->GetTypeId() != TYPEID_PLAYER) +        if (caster->GetTypeId() != TYPEID_PLAYER)              return;          // immediately finishes the cooldown on Frost spells -        const SpellCooldowns& cm = m_caster->ToPlayer()->GetSpellCooldownMap(); +        const SpellCooldowns& cm = caster->ToPlayer()->GetSpellCooldownMap();          for (SpellCooldowns::const_iterator itr = cm.begin(); itr != cm.end();)          {              SpellEntry const *spellInfo = sSpellStore.LookupEntry(itr->first); @@ -64,7 +56,7 @@ class spell_mage_cold_snap_SpellScript : public SpellScript                  (GetSpellSchoolMask(spellInfo) & SPELL_SCHOOL_MASK_FROST) &&                  spellInfo->Id != SPELL_MAGE_COLD_SNAP && GetSpellRecoveryTime(spellInfo) > 0)              { -                m_caster->ToPlayer()->RemoveSpellCooldown((itr++)->first, true); +                caster->ToPlayer()->RemoveSpellCooldown((itr++)->first, true);              }              else                  ++itr; @@ -85,35 +77,19 @@ SpellScript * GetSpellScript_spell_mage_cold_snap()  class spell_mage_polymorph_cast_visual_SpellScript : public SpellScript  { +    static const uint32 spell_list[6]; +      bool Validate(SpellEntry const * spellEntry)      { -        const uint32 spell_list[6] = { -            SPELL_MAGE_SQUIRREL_FORM, -            SPELL_MAGE_GIRAFFE_FORM, -            SPELL_MAGE_SERPENT_FORM, -            SPELL_MAGE_DRAGONHAWK_FORM, -            SPELL_MAGE_WORGEN_FORM, -            SPELL_MAGE_SHEEP_FORM -        }; -          // check if spell ids exist in dbc          for (int i = 0; i < 6; i++)              if (!sSpellStore.LookupEntry(spell_list[i]))                  return false;          return true; -    }; +    }      void HandleDummy(SpellEffIndex effIndex)      { -        const uint32 spell_list[6] = { -            SPELL_MAGE_SQUIRREL_FORM, -            SPELL_MAGE_GIRAFFE_FORM, -            SPELL_MAGE_SERPENT_FORM, -            SPELL_MAGE_DRAGONHAWK_FORM, -            SPELL_MAGE_WORGEN_FORM, -            SPELL_MAGE_SHEEP_FORM -        }; -          if (Unit *unitTarget = GetHitUnit())              if (unitTarget->GetTypeId() == TYPEID_UNIT)                  unitTarget->CastSpell(unitTarget, spell_list[urand(0, 5)], true); @@ -126,6 +102,15 @@ class spell_mage_polymorph_cast_visual_SpellScript : public SpellScript      }  }; +const uint32 spell_mage_polymorph_cast_visual_SpellScript::spell_list[6] = { +    SPELL_MAGE_SQUIRREL_FORM, +    SPELL_MAGE_GIRAFFE_FORM, +    SPELL_MAGE_SERPENT_FORM, +    SPELL_MAGE_DRAGONHAWK_FORM, +    SPELL_MAGE_WORGEN_FORM, +    SPELL_MAGE_SHEEP_FORM +}; +  SpellScript * GetSpellScript_spell_mage_polymorph_visual()  {      return new spell_mage_polymorph_cast_visual_SpellScript(); @@ -142,7 +127,7 @@ class spell_mage_summon_water_elemental_SpellScript : public SpellScript          if (!sSpellStore.LookupEntry(SPELL_MAGE_SUMMON_WATER_ELEMENTAL_PERMANENT))              return false;          return true; -    }; +    }      void HandleDummy(SpellEffIndex effIndex)      { diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index c5dc3d854ae..4e161091f43 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -23,14 +23,115 @@  #include "ScriptPCH.h" +enum PriestSpells +{ +    PRIEST_SPELL_PENANCE_R1                      = 47540, +    PRIEST_SPELL_PENANCE_R1_DAMAGE               = 47758, +    PRIEST_SPELL_PENANCE_R1_HEAL                 = 47757, +    PRIEST_SPELL_PENANCE_R2                      = 53005, +    PRIEST_SPELL_PENANCE_R2_DAMAGE               = 53001, +    PRIEST_SPELL_PENANCE_R2_HEAL                 = 52986, +    PRIEST_SPELL_PENANCE_R3                      = 53006, +    PRIEST_SPELL_PENANCE_R3_DAMAGE               = 53002, +    PRIEST_SPELL_PENANCE_R3_HEAL                 = 52987, +    PRIEST_SPELL_PENANCE_R4                      = 53007, +    PRIEST_SPELL_PENANCE_R4_DAMAGE               = 53003, +    PRIEST_SPELL_PENANCE_R4_HEAL                 = 52988, +}; + +class spell_pri_penance_SpellScript : public SpellScript +{ +    bool Validate(SpellEntry const * spellEntry) +    { +        if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R1)) +            return false; +        if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R1_DAMAGE)) +            return false; +        if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R1_HEAL)) +            return false; + +        if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R2)) +            return false; +        if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R2_DAMAGE)) +            return false; +        if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R2_HEAL)) +            return false; + +        if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R3)) +            return false; +        if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R3_DAMAGE)) +            return false; +        if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R3_HEAL)) +            return false; + +        if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R4)) +            return false; +        if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R4_DAMAGE)) +            return false; +        if (!sSpellStore.LookupEntry(PRIEST_SPELL_PENANCE_R4_HEAL)) +            return false; + +        return true; +    } + +    void HandleDummy(SpellEffIndex effIndex) +    { +        Unit *unitTarget = GetHitUnit(); +        if (!unitTarget || !unitTarget->isAlive()) +            return; + +        Unit *caster = GetCaster(); +        SpellEntry const *spellInfo = GetSpellInfo(); + +        int hurt = 0; +        int heal = 0; +        switch(spellInfo->Id) +        { +            case PRIEST_SPELL_PENANCE_R1: +                hurt = PRIEST_SPELL_PENANCE_R1_DAMAGE; +                heal = PRIEST_SPELL_PENANCE_R1_HEAL; +                break; +            case PRIEST_SPELL_PENANCE_R2: +                hurt = PRIEST_SPELL_PENANCE_R2_DAMAGE; +                heal = PRIEST_SPELL_PENANCE_R2_HEAL; +                break; +            case PRIEST_SPELL_PENANCE_R3: +                hurt = PRIEST_SPELL_PENANCE_R3_DAMAGE; +                heal = PRIEST_SPELL_PENANCE_R3_HEAL; +                break; +            case PRIEST_SPELL_PENANCE_R4: +                hurt = PRIEST_SPELL_PENANCE_R4_DAMAGE; +                heal = PRIEST_SPELL_PENANCE_R4_HEAL; +                break; +            default: +                sLog.outError("spell_pri_penance_SpellScript::HandleDummy: Spell %u Penance need set correct heal/damage spell", spellInfo->Id); +                return; +        } + +        if (caster->IsFriendlyTo(unitTarget)) +            caster->CastSpell(unitTarget, heal, false, 0); +        else +            caster->CastSpell(unitTarget, hurt, false, 0); +    } + +    void Register() +    { +        // add dummy effect spell handler to Penance +        EffectHandlers += EffectHandlerFn(spell_pri_penance_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); +    } +}; + +SpellScript *GetSpellScript_spell_pri_penance() +{ +    return new spell_pri_penance_SpellScript(); +} +  void AddSC_priest_spell_scripts()  { -    //Script *newscript; +    Script *newscript; -    /*      newscript = new Script; -    newscript->Name = "spell_pri_"; -    newscript->GetSpellScript = &GetSpellScript_spell_pri_; +    newscript->Name = "spell_pri_penance"; +    newscript->GetSpellScript = &GetSpellScript_spell_pri_penance;      newscript->RegisterSelf(); -    */ -}
\ No newline at end of file +} diff --git a/src/server/scripts/Spells/spell_rogue.cpp b/src/server/scripts/Spells/spell_rogue.cpp index b701443e98b..c3f581e5539 100644 --- a/src/server/scripts/Spells/spell_rogue.cpp +++ b/src/server/scripts/Spells/spell_rogue.cpp @@ -23,14 +23,176 @@  #include "ScriptPCH.h" +enum RogueSpells +{ +    ROGUE_SPELL_HUNGER_FOR_BLOOD_BUFF            = 63848, +    ROGUE_SPELL_SHIV_TRIGGERED                   = 5940, +    ROGUE_SPELL_CHEATING_DEATH                   = 45182, +    ROGUE_SPELL_GLYPH_OF_PREPARATION             = 56819, +}; + +class spell_rog_cheat_death_SpellScript : public SpellScript +{ +    bool Validate(SpellEntry const * spellEntry) +    { +        if (!sSpellStore.LookupEntry(ROGUE_SPELL_CHEATING_DEATH)) +            return false; +        return true; +    } + +    void HandleDummy(SpellEffIndex effIndex) +    { +        Unit *caster = GetCaster(); +        caster->CastSpell(caster, ROGUE_SPELL_CHEATING_DEATH, true); +    } + +    void Register() +    { +        // add dummy effect spell handler to Cheat Death +        EffectHandlers += EffectHandlerFn(spell_rog_cheat_death_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); +    } +}; + +SpellScript *GetSpellScript_spell_rog_cheat_death() +{ +    return new spell_rog_cheat_death_SpellScript(); +} + +class spell_rog_hunger_for_blood_SpellScript : public SpellScript +{ +    bool Validate(SpellEntry const * spellEntry) +    { +        if (!sSpellStore.LookupEntry(ROGUE_SPELL_HUNGER_FOR_BLOOD_BUFF)) +            return false; +        return true; +    } + +    void HandleDummy(SpellEffIndex effIndex) +    { +        Unit *caster = GetCaster(); +        caster->CastSpell(caster, ROGUE_SPELL_HUNGER_FOR_BLOOD_BUFF, true); +    } + +    void Register() +    { +        // add dummy effect spell handler to Hunger for Blood +        EffectHandlers += EffectHandlerFn(spell_rog_hunger_for_blood_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); +    } +}; + +SpellScript *GetSpellScript_spell_rog_hunger_for_blood() +{ +    return new spell_rog_hunger_for_blood_SpellScript(); +} + +class spell_rog_preparation_SpellScript : public SpellScript +{ +    bool Validate(SpellEntry const * spellEntry) +    { +        if (!sSpellStore.LookupEntry(ROGUE_SPELL_GLYPH_OF_PREPARATION)) +            return false; +        return true; +    } + +    void HandleDummy(SpellEffIndex effIndex) +    { +        Unit *caster = GetCaster(); +        if (caster->GetTypeId() != TYPEID_PLAYER) +            return; + +        //immediately finishes the cooldown on certain Rogue abilities +        const SpellCooldowns& cm = caster->ToPlayer()->GetSpellCooldownMap(); +        for (SpellCooldowns::const_iterator itr = cm.begin(); itr != cm.end();) +        { +            SpellEntry const *spellInfo = sSpellStore.LookupEntry(itr->first); +     +            if (spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE) +            { +                if (spellInfo->SpellFamilyFlags[1] & SPELLFAMILYFLAG1_ROGUE_COLDB_SHADOWSTEP ||      // Cold Blood, Shadowstep +                    spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG_ROGUE_VAN_EVAS_SPRINT)           // Vanish, Evasion, Sprint +                    caster->ToPlayer()->RemoveSpellCooldown((itr++)->first, true); +                else if (caster->HasAura(ROGUE_SPELL_GLYPH_OF_PREPARATION)) +                { +                    if (spellInfo->SpellFamilyFlags[1] & SPELLFAMILYFLAG1_ROGUE_DISMANTLE ||         // Dismantle +                        spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG_ROGUE_KICK ||               // Kick +                        (spellInfo->SpellFamilyFlags[0] & SPELLFAMILYFLAG_ROGUE_BLADE_FLURRY &&     // Blade Flurry +                         spellInfo->SpellFamilyFlags[1] & SPELLFAMILYFLAG1_ROGUE_BLADE_FLURRY)) +                        caster->ToPlayer()->RemoveSpellCooldown((itr++)->first, true); +                    else +                        ++itr; +                } +                else +                    ++itr; +            } +            else +                ++itr; +        } +    } + +    void Register() +    { +        // add dummy effect spell handler to Preparation +        EffectHandlers += EffectHandlerFn(spell_rog_preparation_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); +    } +}; + +SpellScript *GetSpellScript_spell_rog_preparation() +{ +    return new spell_rog_preparation_SpellScript(); +} + +class spell_rog_shiv_SpellScript : public SpellScript +{ +    bool Validate(SpellEntry const * spellEntry) +    { +        if (!sSpellStore.LookupEntry(ROGUE_SPELL_SHIV_TRIGGERED)) +            return false; +        return true; +    } + +    void HandleDummy(SpellEffIndex effIndex) +    { +        Unit *caster = GetCaster(); +        if (caster->GetTypeId() != TYPEID_PLAYER) +            return; + +        if (Unit *unitTarget = GetHitUnit()) +            caster->CastSpell(unitTarget, ROGUE_SPELL_SHIV_TRIGGERED, true); +    } + +    void Register() +    { +        // add dummy effect spell handler to Hunger for Blood +        EffectHandlers += EffectHandlerFn(spell_rog_shiv_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); +    } +}; + +SpellScript *GetSpellScript_spell_rog_shiv() +{ +    return new spell_rog_shiv_SpellScript(); +} +  void AddSC_rogue_spell_scripts()  { -    //Script *newscript; +    Script *newscript; + +    newscript = new Script; +    newscript->Name = "spell_rog_cheat_death"; +    newscript->GetSpellScript = &GetSpellScript_spell_rog_cheat_death; +    newscript->RegisterSelf(); + +    newscript = new Script; +    newscript->Name = "spell_rog_hunger_for_blood"; +    newscript->GetSpellScript = &GetSpellScript_spell_rog_hunger_for_blood; +    newscript->RegisterSelf(); + +    newscript = new Script; +    newscript->Name = "spell_rog_preparation"; +    newscript->GetSpellScript = &GetSpellScript_spell_rog_preparation; +    newscript->RegisterSelf(); -    /*      newscript = new Script; -    newscript->Name = "spell_rog_"; -    newscript->GetSpellScript = &GetSpellScript_spell_rog_; +    newscript->Name = "spell_rog_shiv"; +    newscript->GetSpellScript = &GetSpellScript_spell_rog_shiv;      newscript->RegisterSelf(); -    */  }
\ No newline at end of file | 
